2016-06-06 5 views
-1

Я столкнулся с проблемой с алгоритмом CRC16. Существует строка hex 80 01 F0, после CRC16 я получаю младший байт = 23, а высокий - 80. Итак, вопрос в том, как вычислить эти два байта? Я пробовал калькуляторы CRC, но результата не было. Кроме того, было бы идеально, если бы был пример этого метода в Java. В руководстве есть дополнительная информация: Низкий и высокий байт алгоритма прямого CRC-16 с использованием полиномии (X16 + X15 + X2 + 1), рассчитанной для всех байтов. Он инициализируется с использованием семени 0xFFFF.Рассчитать низкие и высокие байты CRC16 - Java

+0

Пожалуйста, внесите ваш код. Мы не можем изображать ошибки в вашем коде ... не видя этого. – GhostCat

+0

Итак, я прошу вас написать метод на Java. Что-то вроде: public byte [] getLowHighBytes (byte [] someArray) {...} –

+2

И я говорю вам, что stackoverflow - это ** не ** служба доставки кода. Мы помогаем с конкретными проблемами не с «У меня есть видение, но нет плана, пожалуйста, проинструктируйте». Мы ** не делаем вашу работу за вас. – GhostCat

ответ

0

Благодарим за ответы. Я уверен, что мой ответ будет полезен для других. Проверенный и рабочий код.

private static byte[] getCRC16LowHighBytes(byte[] byteSequence) { 
    // Create a byte array for Low and High bytes 
    byte[] returnBytes = new byte[2]; 
    int crc = CRC16_SEED; 
    for (int i = 0; i < byteSequence.length; ++i) { 
     crc ^= (byteSequence[i] << 8); 
     for (int j = 0; j < 8; ++j) { 
      if ((crc & 0x8000) != 0) { 
       crc = (crc << 1)^CRC16_POLINOM; 
      } else { 
       crc <<= 1; 
      } 
     } 
    } 
    byte[] crcBytes = getBytes(crc); 
    // The first two bytes of crcBytes are low and high bytes respectively. 
    for (int i = 0; i < returnBytes.length; i++) { 
     returnBytes[i] = crcBytes[i]; 
    } 
    return returnBytes; 
} 

private static byte[] getBytes(int v) { 
    byte[] writeBuffer = new byte[4]; 
    writeBuffer[3] = (byte) ((v >>> 24) & 0xFF); 
    writeBuffer[2] = (byte) ((v >>> 16) & 0xFF); 
    writeBuffer[1] = (byte) ((v >>> 8) & 0xFF); 
    writeBuffer[0] = (byte) ((v >>> 0) & 0xFF); 
    return writeBuffer; 
} 
Смежные вопросы