Python binascii.crc32似乎无法正常工作

时间:2015-10-06 01:33:02

标签: python crc32

我正在尝试使用CRC16/32binascii.crc32

binacsii.crc_hqx校验和

这是我用作示例的值(我从这个示例中得到了值 我正在阅读的一些网络协议规范。)

  1. CRC 16

    输入(以ASCII字符串形式):123456789

    种子:0x0000

    哈希结果:0x31c3

  2. CRC 32

    输入(以ASCII字符串形式):123456789

    种子:0x00000000

    哈希结果:0xd202d277

  3. 下面是我的测试代码,上面有测试值。

    >>> 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的文件中得到了这些值。

    以下是我引用的表格

    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 个答案:

答案 0 :(得分:4)

此在线计算器

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

同意Python

enter image description here

你能引用你0xd202d277的来源吗?有关位顺序等的变化。

答案 1 :(得分:0)

CRC catalog开始,您似乎正在使用 CRC-32 / MPEG-2 。而python使用普通CRC32,而使用多项式0xEDB88320

顺便说一下,python返回的CRC是int。而python的int是签名。如果您需要无符号表示,则需要invert the result,例如hex(~0x76e943d9 & 0xffffffff)