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
我该怎么办?。
答案 0 :(得分:1)
您可以使用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'
如果您想自己动手,可以简单地将十六进制字符串拆分为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转换有一个很棒的library:binascii
将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