我正在尝试使用CRC16/32
,binascii.crc32
binacsii.crc_hqx
校验和
这是我用作示例的值(我从这个示例中得到了值 我正在阅读的一些网络协议规范。)
CRC 16
输入(以ASCII字符串形式):123456789
种子:0x0000哈希结果:0x31c3
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 doc Since the algorithm is designed for use as a checksum algorithm, it is not suitable for use as a general hash algorithm.
这是否意味着我不能将它用于CRC32校验和?
如果有,有什么建议吗?
----------------------编辑----------------------
我自己没有制作测试值。
我刚从一份解释CRC32的文件中得到了这些值。
以下是我引用的表格
----------------------编辑----------------------
在包含图表的文档中,它描述了如下的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
不同吗?
答案 0 :(得分:4)
此在线计算器
http://www.lammertbies.nl/comm/info/crc-calculation.html
同意Python
你能引用你0xd202d277
的来源吗?有关位顺序等的变化。
答案 1 :(得分:0)
从CRC catalog开始,您似乎正在使用 CRC-32 / MPEG-2 。而python使用普通CRC32,而使用多项式0xEDB88320
。
int
。而python的int是签名。如果您需要无符号表示,则需要invert the result,例如hex(~0x76e943d9 & 0xffffffff)
。