@DD-var

Как исправить ошибку?

private void button1_Click(object sender, EventArgs e)
        {
           
             byte[] message=new byte[] {00, 03, 01, 00, 00, 0x0C };
            byte[] CRC = new byte[2];
            CRC = mass(message);

            label1.Text = CRC[0]+"    "+CRC[1].ToString();

          
        }


        

     static public byte[] mass(byte[] message) {
           
            byte[] CRC = new byte [16] ;
            ushort Register = 0xFFFF;
            ushort Polinom = 0xA001;

            for(int i = 0; i < message.Length; i++)
            {
                Register = (ushort)(Register ^ message[i]);
                for(int j = 0; j< 8; j++)
                {
                    if ((ushort)(Register & 0x01) == 1)
                    {
                        Register = (ushort)(Register >> 1);
                        Register = (ushort)(Register ^ Polinom);
                    }
                    else
                    {
                        Register = (ushort)(Register >> 1);
                    }
                }
            }

            CRC[1] = (byte)(Register >> 1);
            CRC[0] = (byte)(Register & 0x00ff);

            return CRC;
           
        }


пишу код что б посчитаь CRC считает не то что надо ответ должен по калькулятору выходить E245
где я косячу?
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 1
Collin
@Collin
message, который заправляем в класс для расчёта CRC

byte[] message = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 }; // Последние 2 байта под CRC, заполняем нолями 
byte[] CRC = (new byte[2]);

GetCRC data = new GetCRC();
data._GetCRC(message, ref CRC); // для этого примера CRC будет равно 0xDDBA, т.е. BA DD

byte[] message_out = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, CRC[0], CRC[1] };


Рассчитать CRC

class GetCRC
    {
        // -----------------------------------------------------------------------------
        //Возвращает двухбайтовую контрольную сумму. + Алгоритм расчета CRC
        // -----------------------------------------------------------------------------
        public void _GetCRC(byte[] message, ref byte[] CRC)              // входные данные функции : byte[] message(см. строчку где message.Length)- это данные которые пришли в функцию,
                                                                         // входные данные функции: ref byte[] CRC - эти данные мы получаем внутри этой функции и потом выводим в тело
                                                                         // программы откуда мы вызвали эту ффункцию
        {
            ushort CRCFull = 0xFFFF;                                     // 16-ти битовый регистр загружается числом FF hex (все 1), и используется далее как регистр CRC
            char CRCLSB;                                                 // переменная определения значения младшего бита в цикле
            for (int i = 0; i < (message.Length) - 2; i++)               //Повторяются шаги для следующего сообщения(1). Это повторяется до тех пор пока все байты сообщения не будут обработаны.  
            {
                CRCFull = (ushort)(CRCFull ^ message[i]);                // Первый байт сообщения (- 2 это отсекаем место под CRC) складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ
                                                                         // с содержимым регистра CRC. Результат помещается в регистр CRC
                for (int j = 0; j < 8; j++)                              // цикл повторяется 8 раз
                {
                    CRCLSB = (char)(CRCFull & 0x0001);                   // Если младший бит 0. Повторяется сдвиг (следующая строка).
                    CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);         // Регистр CRC сдвигается вправо(в направлении младшего бита) на 1 бит, старший бит заполняется 0
                    if (CRCLSB == 1)                                     // Если младший бит 1
                        CRCFull = (ushort)(CRCFull ^ 0xA001);            // Делается операция ИСКЛЮЧАЮЩЕЕ ИЛИ регистра CRC и полиномиального числа A001 hex
                }
            }
            CRC[1] = (byte)((CRCFull >> 8) & 0xFF);                      // определяем получившийся старший байт 
            CRC[0] = (byte)(CRCFull & 0xFF);                             // определяем получившийся младший байт 
        }

    }


По теме:
Калькулятор CRC
Как посчитать контрольную сумму CRC (32, 16, 8)
Статья о расчете CRC на хабре
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы