2016-02-04 10 views
0

Я пытаюсь оценить соответствующую контрольную сумму на основе CRC-16 алгоритм с использованием crcmod Модуль Python и версия 2.5 интерпретатора Python. Параметры контрольной суммы являются:Расчет CRC16 в Python

  • CRC заказ: 16
  • CRC полином: 0x8005
  • щёток значение: 0xFFFF
  • Конечное значение: 0x0000
  • Direct: Правда

Код:

crc16 = crcmod.mkCrcFun(0x18005, rev=False, initCrc=0xFFFF, xorOut=0x0000) 
print hex(crc16(str(int(0x5A0001)))) 

и для ввода 0x5A0001 он печатает 0x7E16, пока я должен получить что-то вроде 0xCE0A.

Я проверил на http://www.lokker.net/Java/crc/CRCcalculation2.htm, и вычисленное значение равно 0xACE, что является правильным (относительно заказа).

+2

Похоже, что у вас есть '0x18005' в качестве вашего полинома в коде python, но вы указали« 0x8005 »в своих параметрах контрольной суммы выше. – daveydave400

+0

Нет, '0x18005' подходит для' crcmod'. Этот пакет определяет количество бит в CRC из полного полинома. Обычно предоставляется полином CRC без высокого срока, например. '0x8005' и отдельно указать, что это 16-разрядный CRC. –

+0

Во-первых, вы создали 'c16', а затем попытались использовать' crc16'. Вы имели в виду 'c16'? Во-вторых, что именно вы думаете, что вы вычисляете CRC? Вы знаете, что 'str (int (0x5A0001))' возвращает строку цифр ASCII '5898241', да? Что вы ввели в калькулятор CRC в Интернете? –

ответ

2

crcmod работает нормально. Вы не даете ему три байта, которые, как вы думаете, вы его даете. Ваш str(int(0x5A0001)) предоставляет семь байтов, которые являются символами ASCII 5898241 - преобразование 0x5a0001 в десятичное.

кормить его байты 0x5a 0x00 0x01, вы бы вместо того, чтобы (как один подход):

print hex(crc16("5a0001".decode("hex"))) 

Это печатает 0xace.

+0

Спасибо, Марк! Теперь crc вычисляется должным образом. Можно ли выразить эти три отдельных байта: ** 0x5a ** ** 0x00 ** ** 0x01 ** как одно целое, или я что-то не хватает? – Qrlet

+0

Конечно, вы могли бы написать что-то, чтобы извлечь эти три байта из целого числа «0x5a0001», например. '(x >> 16) & 0xff',' (x >> 8) & 0xff' и 'x & 0xff'. Но зачем вам это делать? –

+0

Я думал, как разделить '0x5a0001' на эти 3 байта, не используя' .decode (str) '. Другими словами, как я могу, например, вычислить контрольную сумму для '0x5a00' и' 0x01'? – Qrlet