Modbus crc计算

时间:2017-10-11 08:13:34

标签: python

def calcString( st, crc):
    """Given a binary string and starting CRC, Calc a final CRC-16 """
    for ch in st:
        crc = (crc >> 8) ^ table[(crc ^ ord(ch)) & 0xFF]
    return crc

我为以下字符串值获取不同的CRC值:

051075F9000C1800000000000000000000000000002D0A0C00000000000014

\x05\x10\x75\xF9\x00\x0C\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2D\x0A\x0C\x00\x00\x00\x00\x00\x00\x14

请帮助我。

如果我想转换此

051075F9000C1800000000000000000000000000002D0A0C00000000000014 

 \x05\x10\x75\xF9\x00\x0C\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2D\x0A\x0C\x00\x00\x00\x00\x00\x00\x14

我该怎么办?。

2 个答案:

答案 0 :(得分:1)

使用binascii

您可以使用binascii.unhexlify(感谢@JonClements):

>>> import binascii
>>> binascii.unhexlify(b"051075F9000C1800000000000000000000000000002D0A0C00000000000014")b'\x05\x10u\xf9\x00\x0c\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\n\x0c\x00\x00\x00\x00\x00\x00\x14'

使用chr和int

如果您想自己动手,可以简单地将十六进制字符串拆分为2个字符的列表,将其转换为int并使用chr获取相应的字符:

>>> import re
>>> crc = "051075F9000C1800000000000000000000000000002D0A0C00000000000014"
>>> if len(crc) % 2: raise ValueError('Incorrect string. Length should be even')
>>> xxs = re.findall('[0-9a-f]{2}', crc, re.I)
>>> xxs
['05', '10', '75', 'F9', '00', '0C', '18', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '2D', '0A', '0C', '00', '00', '00', '00', '00', '00', '14']
>>> ''.join(chr(int(xx, 16)) for xx in xxs)
'\x05\x10uù\x00\x0c\x18\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00-\n\x0c\x00\x00\x00\x00\x00\x00\x14'

请注意,"\x75"显示为"u"

>>> chr(int('75', 16))
'u'

字符串是相同的,但是:

>>> chr(int('75', 16)) == "\x75"
True

答案 1 :(得分:0)

二进制和ASCII转换有一个很棒的librarybinascii

将ASCII字符串转换为HEX字符串所需的具体方法是binascii.unhexlify(hexstr)binascii.a2b_hex(hexstr)(这两种实际上是相同的方法)。来自文档:

  

返回十六进制字符串hexstr表示的二进制数据。该函数与b2a_hex()的反函数。 hexstr必须包含偶数个十六进制数字(可以是大写或小写),否则会引发TypeError。

示例:

plain = "051075F9000C1800000000000000000000000000002D0A0C00000000000014"
binary = binascii.unhexlify(plain)

为了完整起见,相反的操作是:

ascii = binascii.hexlify(binary) # Note: Returns lowercase hex chars