我正在尝试在基于网络的协议上实施CRC验证。 CRC计算通过PyCRC lib完成。
PyCRC将为给定的数据包生成校验和,并返回如下结果: CB3D9FD1
当我尝试在线上发送它时,不知何故python修改我的字符串并将其转换为ascii为Hex,例如:
Crc = "CB3D9FD1"
...
buffer = "\x41\x42\x43\x44"+crc
...
s.send(buffer)
在电线上我会看到:
\x41\x42\x43\x44***\x43\x42\x33\x44\x39\x46\x44\x31***
而不是:
\x41\x42\x43\x44***\xCB\x3D\x9F\xD1***
有什么方法可以轻松解决这个问题吗?
谢谢!
答案 0 :(得分:2)
实际上,请勿将CRC转换为ASCII。将其保留为十六进制,然后使用struct.pack ::
将其打包为字节字符串buffer += struct.pack("L", crc)
答案 1 :(得分:0)
如果已将CRC转换为包含“CB3D9FD1”的字符串,则正确的字节序列为0x43 0x42 0x33 0x44 0x39 0x46 0x44 0x31。不要将cry转换为字符串或将字符串解析为十六进制(每个字节两个字符)。
答案 2 :(得分:0)
通过这种方式分配:crc = "CB3D9FD1"
你说make var crc是一个8字节的字符串。正如@Bashwork所说,你需要将它从十六进制字符串转换为数字或保持数字。像这样用 0x 分配它来得到一个数值:crc=0xCB3D9FD1
。
pack(“L”,x)表示我给你的x是(必须是)整数,我希望你把它打包成 unsigned long 。
您得到“struct.error:无法将参数转换为整数”,因为您正在将pack(“L”,...)传递给字符串“CB3D9FD1”。
RTFM“L”和“I”以及其他args的意思是:https://docs.python.org/2/library/struct.html
将CRC打包为长整数:并且你得到0s填充到64位(在我的电脑上.YMMV)
>>> from struct import pack
>>> crc=0xcb3d9fd1
>>> repr(crc)
'3409813457'
>>> pack("L", crc)
'\xd1\x9f=\xcb\x00\x00\x00\x00'
>>> print crc
3409813457
也许你想使用pack(“我”,......):得到32位
>>> pack("I",crc)
'\xd1\x9f=\xcb'
如果尝试使用pack(“L”,...)打包CRC字符串,则会失败:
>>> crc = "CB3D9FD1"
>>> repr(crc)
"'CB3D9FD1'"
>>> pack("L", crc)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
struct.error: cannot convert argument to integer