我正在尝试在基于网络的协议上实现CRC验证。CRC 计算是通过 PyCRC 库完成的。
PyCRC 将为给定数据包生成校验和,并返回如下结果:CB3D9FD1
当我尝试通过网络发送它时,python 以某种方式修改了我的字符串并将其转换为 ascii 中的十六进制,例如:
Crc = "CB3D9FD1"
...
buffer = "x41x42x43x44"+crc
...
s.send(buffer)
在电线上,我会看到:
x41x42x43x44***x43x42x33x44x39x46x44x31***
而不是:
x41x42x43x44***xCBx3Dx9FxD1***
有什么方法可以轻松解决此问题吗?
谢谢!
实际上,不要将CRC转换为ASCII。将其保留为十六进制,然后使用 struct.pack:将其打包成字节字符串:
buffer += struct.pack("L", crc)
如果已将 CRC 转换为包含"CB3D9FD1"的字符串,则0x43 0x42 0x33 0x44 0x39 0x46 0x44 0x31正确的字节序列。不要将 cry 转换为字符串或将字符串解析为十六进制(每个字节两个字符(。
通过这样分配它:crc = "CB3D9FD1"
你说的是让 var crc 成为一个 8 字节的字符串。正如@Bashwork所说,您需要将其从十六进制字符串转换为数字或保持数字。像这样用 0x 分配它以获得一个数值:crc=0xCB3D9FD1
.
pack("L",x( 表示我给你 x 它是(必须是(一个整数,我希望你把它打包为无符号长整型。
你得到">struct.error:无法将参数转换为整数",因为你正在传递 pack("L",...( 一个字符串 "CB3D9FD1"。
RTFM "L"和"I"以及其他参数的含义:https://docs.python.org/2/library/struct.html
将 CRC 打包为长整数工作:你会得到 0s 填充到 64 位(在我的 PC 上。扬子晚报(
>>> from struct import pack
>>> crc=0xcb3d9fd1
>>> repr(crc)
'3409813457'
>>> pack("L", crc)
'xd1x9f=xcbx00x00x00x00'
>>> print crc
3409813457
也许你想使用pack("I",...(:获得32位
>>> pack("I",crc)
'xd1x9f=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