Контрольная сумма байтов 16 бит С#?

Добрый день!

Меня интересует такой вопрос, точнее в голову не укладывается работа с битами.

Что требуется:
Есть устройство которое кушает команды, но в конце каждой команды сообщение дополнится контрольной суммой состоящей из 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}

Заранее благодарю :)
  • Вопрос задан
  • 836 просмотров
Пригласить эксперта
Ответы на вопрос 1
Neuroware
@Neuroware
Программист в свободное от работы время
Если я правильно понял вам нужно "меньше цифр в сумме", в таком случа вот тот же алгоритм что у вас, только с меньшим числом разрядов (2)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы