我正在尝试在基于网络的协议上实现CRC验证。 CRC计算是通过PyCRC库完成的。在
PyCRC将为给定数据包生成校验和并返回如下结果: CB3D9FD1型
当我试图通过网络发送它时,python会以某种方式修改我的字符串并将其以ascii格式转换为十六进制,例如:
Crc = "CB3D9FD1"
...
buffer = "\x41\x42\x43\x44"+crc
...
s.send(buffer)
我会在电报上看到:
^{pr2}$而不是:
\x41\x42\x43\x44***\xCB\x3D\x9F\xD1***
有什么方法可以轻松解决这个问题吗?在
谢谢!在
如果已将CRC转换为包含“CB3D9FD1”的字符串,则正确的字节序列为0x43 0x42 0x33 0x44 0x39 0x46 0x44 0x31。不要将cry转换为字符串或将字符串解析为十六进制(每个字节两个字符)。在
通过这样分配它:
crc = "CB3D9FD1"
你是说让var crc成为一个8字节的字符串。正如@Bashwork所说,您需要将它从十六进制字符串转换为数字或保持它为数字。像这样用0x赋值,得到一个数值:crc=0xCB3D9FD1
。在pack(“L”,x)表示我给你x,它(必须是)一个整数,我希望你把它打包成一个无符号long
你得到了“结构错误:无法将参数转换为整数“,因为您正在向pack(“L”,…)传递字符串“CB3D9FD1”。在
RTFM“L”和“I”以及其他参数的含义:https://docs.python.org/2/library/struct.html
将CRC压缩成long integer有效:然后0填充到64位(在我的PC.YMMV上)
也许你想用pack(“I”,…):得到32位
^{pr2}$如果尝试用pack(“L”,…)压缩CRC字符串,则失败:
实际上,不要把你的CRC转换成ASCII。保持十六进制,然后使用struct.pack将其压缩为字节字符串:
相关问题 更多 >
编程相关推荐