Добрый день!
Меня интересует такой вопрос, точнее в голову не укладывается работа с битами.
Что требуется:
Есть устройство которое кушает команды, но в конце каждой команды сообщение дополнится контрольной суммой состоящей из 2х байт.
Побывал алгоритмы CRC 16 но они выдают не то что надо при проверке.
Пример сообщения:byte[] message = new byte[]{0x4C,0x00,0x00,0x00};
Перед отправкой в устройство оно должно иметь вид:
byte[] message = new byte[] {0x4C,0x00,0x00,0x00,0x4C,0x00};
Тесть последние 2 байта
{0x4C,0x00} представляют из себя контрольную сумму.
Как правильно сделать подсчет?
Вот с контрольной суммой в 1 байт труда не составляет, но тут я так понимаю нужно переносить разряды что в голове почему то не укладывается.
Побывал использовать алгоритм, но выдает он мне не совсем то что надо. А сакрального смысла работы понять не могу.
public class Crc16
{
const ushort polynomial = 0xFFFF;
ushort[] table = new ushort[256];
public ushort ComputeChecksum(byte[] bytes)
{
ushort crc = 0;
for (int i = 0; i < bytes.Length; ++i)
{
byte index = (byte)(crc ^ bytes[i]);
crc = (ushort)((crc >> 8) ^ table[index]);
}
return crc;
}
public byte[] ComputeChecksumBytes(byte[] bytes)
{
ushort crc = ComputeChecksum(bytes);
return BitConverter.GetBytes(crc);
}
public Crc16()
{
ushort value;
ushort temp;
for (ushort i = 0; i < table.Length; ++i)
{
value = 0;
temp = i;
for (byte j = 0; j < 8; ++j)
{
if (((value ^ temp) & 0x0001) != 0)
{
value = (ushort)((value >> 1) ^ polynomial);
}
else
{
value >>= 1;
}
temp >>= 1;
}
table[i] = value;
}
}
}
Подскажите пожалуйста или объясните как работает данный алгоритм и что в нем необходимо изменить что бы при подсчете суммы байт:
{0x4C,0x00,0x00,0x00}
Получить сумму:
{0x4C,0x00}Заранее благодарю :)