2015-10-06 3 views
0

Я пытаюсь CRC16/32 контрольной суммы с binascii.crc32, binacsii.crc_hqxPython binascii.crc32, похоже, не работает должным образом

Это ценности, которые я использовал в качестве примера (я получил этот пример значения из некоторые спецификации протокола сети Читаю) ,

  1. CRC 16

    вход (в ASCII-строки): 123456789

    семян: 0х0000

    хеш-результата: 0x31c3

  2. CRC 32

    вход (как ASCII): 123456789

    семян: 0x00000000

    результат хеширования: 0xd202d277

Ниже мой тестовый код с выше контрольных значений.

>>> import binascii 
>>> hex(binascii.crc_hqx("123456789", 0x0000)) 
'0x31c3' #corret result, same as test value result 

>>> hex(binascii.crc32("123456789", 0x00000000) & 0xFFFFFFFF) 
'0xcbf43926L'#Wrong result, different value from test value result, It Must be 0xd202d277 

В чем проблема ...?

На самом деле я нашел это предложение в Python документ Since the algorithm is designed for use as a checksum algorithm, it is not suitable for use as a general hash algorithm.

Означает ли это, я не могу использовать его для CRC32 контрольной суммы?

Если да, есть ли рекомендации?

---------------------- Редактировать ----------------------

Я сам не делал тестовые значения.

Я только что получил значения из документа, объясняющего CRC32.

Ниже приводится таблица I ссылка

enter image description here

---------------------- Редактировать -------- --------------

В документе, содержащем таблицу рисунков, описывается G2S_crc, как показано ниже.

The CRC-32 polynomial defined for G2S can be described as follows: 
x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 
It is also represented as 0x04C11DB7. This polynomial is also used by IEEE 802.3. 

.

function crc(bit array bitString[1..len], int polynomial) 
{ 
shiftRegister := initial value // either the seed or all 1 bits 
for i from 1 to len 
{ 
if most significant bit of shiftRegister = 1 
{ 
// Shift left, place data bit as LSB, then divide 
shiftRegister := shiftRegister left shift 1 
shiftRegister := shiftRegister or bitString[i] 
shiftRegister := shiftRegister xor polynomial 
} 
else 
{ 
// shiftRegister is not divisible by polynomial yet. 
// Just shift left and bring current data bit onto LSB of shiftRegister 
shiftRegister := shiftRegister left shift 1 
shiftRegister := shiftRegister or bitString[i] 
} 
} 
return shiftRegister 
} 

Отличается от binascii?

+2

Нет, это означает, что он предназначен для контрольной суммы, а не для общего алгоритма хэширования ... ergo вы должны использовать его только как контрольную сумму ... почему вы думаете, что это неправильный результат? –

+0

@ Joran Beasley По моим тестовым значениям, я думаю, что это должно быть '0xd202d277' не' 0xcbf43926' – SangminKim

+0

почему вы думаете, что 0xd292d277 - правильный ответ, а не 0xcbf42926 –

ответ

3

Этот онлайн калькулятор

http://www.lammertbies.nl/comm/info/crc-calculation.html

согласуется с Python

enter image description here

Вы можете процитировать источник, который вы получили от 0xd202d277? Существуют вариации в отношении порядка бит и т. Д.

+0

Я думал о публикации этого вопроса ... но решил, что он действительно не ответил на вопрос +1, однако для предположения, что его «источник» либо ошибочен, либо использует другой алгоритм ... –

0

От этого CRC catalog, вы, кажется, используете CRC-32/MPEG-2. В то время как python использует простой CRC32, с полином 0xEDB88320.

BTW, CRC, возвращенный python, является int. И int python - , подписанный. Если вам требуется представление без знака, вам необходимо указать invert the result, например hex(~0x76e943d9 & 0xffffffff).