【问题标题】:CRC checksum calculation from Python来自 Python 的 CRC 校验和计算
【发布时间】:2017-12-08 17:40:37
【问题描述】:

我正在尝试计算 CRC32-C 校验和值。我参考了很多在线 CRC 计算器和很多网站来编写我自己的 crc 校验和计算器。我没有得到预期的结果。根据我的研究,只有“http://crccalc.com/”给出了我的预期值。

我看到有很多带表格的方法,没有表格..等等似乎对我没有用,我正在上传用于计算 crc 的简单方法程序

POLY_LENGTH = 32

def convertobin(input_message):
    input_message = bin(input_message[::-1])
    return input_message

def find_xor(polynomial, input_message):
    # print polynomial
    print input_message
    xor = polynomial ^ input_message
    return xor

def find_crc(polynomial, packet):
    print len(packet)
    input_messageInBin = bin(int(packet,16))[2:]
    print input_messageInBin, type(input_messageInBin)
    input_messageInBin = input_messageInBin + '0'*31
    inputMessageLength = len(input_messageInBin)
    firstTime = 1
    remainder = 0
    startmarker = 0
    control = 1
    diff = 0
    stopmarker = 0
    import pdb; pdb.set_trace()
    while control:
        if len(input_messageInBin) > (startmarker + 32) :
            if firstTime:
                inputString = input_messageInBin[0:POLY_LENGTH]
                stopmarker = POLY_LENGTH - 1
                xor = find_xor(polynomial, int(inputString,2))

                xor_bits_length = len(bin(xor)) - 2
                remainder = str(bin(xor))[2:]
                diff = POLY_LENGTH - xor_bits_length
                firstTime = 0
                startmarker = startmarker + diff - 1
            else:
                diff_bits = input_messageInBin[stopmarker+1:stopmarker+diff+1]
                inputString = remainder + diff_bits
                print "--------------------------------------------------------"
                print "Total number of different bits are: ", diff
                print "remainder + diff_bits : ", remainder, "+", diff_bits
                print "XOR of :"
                print inputString
                print bin(polynomial)[2:]
                xor = find_xor(polynomial, int(inputString,2))
                xor_bits_length = len(bin(xor)) - 2
                remainder = str(bin(xor))[2:]
                print remainder
                print "--------------------------------------------------------"
                diff = POLY_LENGTH - xor_bits_length
                stopmarker = stopmarker + diff
                startmarker = startmarker + diff

        else:
            control = 0
            remainder = remainder + input_messageInBin[startmarker:stopmarker]
            print stopmarker
            print startmarker

    return remainder
val = find_crc(0x1EDC6F41, 'FFFFFFFFFFFFFFFFFFFF0F0FB01013F2E8FAF0421208')
print val

我正在努力让它发挥作用。感谢有人对此有解决方案

【问题讨论】:

  • 没有什么可以回答的,但您应该检查 PEP8 的导入。它们应该位于文件的开头,没有正当理由将它们包含在函数(或类,就此而言)中。它并没有真正受到伤害,但仍然不能...This 答案在这里解释了一点。
  • binascii.crc32 是否适合您的目的?

标签: python crc32


【解决方案1】:

就我测试使用 CRC-32C(讨厌的 ceph 对象)的模块而言,最好的是 crccheck,它不像大多数实现那样需要 SSE4。

>>> from crccheck.crc import Crc32c
>>> Crc32c().process(b'kwarunek').finalhex()
'aa862086'

http://crccalc.com/ 给出相同的结果。

编辑:计算十六进制值

crccheck 能够计算十六进制值的校验和,只需要将该值作为字节传递 - method for large integers

x = int('FFFFFFFFFFFFFFFFFFFF0F0FB01013F2E8FAF0421208', 16)
nbytes, rem = divmod(x.bit_length(), 8)
if rem: nbytes += 1
prepared = x.to_bytes(nbytes, 'big')

Crc32c().process(prepared).finalhex()

【讨论】:

  • 谢谢。但这需要 ascii 字符而不是十六进制,我从多个模块 lice crcmod、crccheck 中获得了十六进制的值...对于获取十六进制值的 crc 是否有任何帮助...您可以在我的示例中看到我是尝试计算十六进制数字的 crc
猜你喜欢
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2015-06-29
  • 2010-12-18
  • 2021-04-05
  • 2017-09-24
相关资源
最近更新 更多