0

我正在尝试在基于网络的协议上实现 CRC 验证。CRC 计算是通过 PyCRC 库完成的。

PyCRC 将为给定的数据包生成校验和并返回如下结果:CB3D9FD1

当我尝试通过网络发送它时,python 会以某种方式修改我的字符串并将它的 ascii 转换为十六进制,例如:

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***

有什么方法可以轻松解决这个问题?

谢谢 !

4

3 回答 3

2

实际上,不要将您的 CRC 转换为 ASCII。将其保存为十六进制,然后使用struct.pack ::将其打包成字节字符串

buffer += struct.pack("L", crc)
于 2011-12-29T19:18:22.357 回答
0

如果您已将 CRC 转换为包含“CB3D9FD1”的字符串,则正确的字节序列为 0x43 0x42 0x33 0x44 0x39 0x46 0x44 0x31。不要将 cry 转换为字符串或将字符串解析为十六进制(每个字节两个字符)。

于 2011-12-29T19:23:34.327 回答
0

通过这种方式分配它:crc = "CB3D9FD1"你是说让 var crc 成为一个 8 字节的字符串。正如@Bashwork 所说,您需要将其从十六进制字符串转换为数字或保持数字。像这样用0x分配它以获得一个数值:crc=0xCB3D9FD1

pack("L",x) 意味着我给你 x 这是(必须是)一个整数,我希望你把它打包成一个unsigned long
你得到“struct.error: cannot convert argument to integer”,因为你传递了 pack("L",...) 一个字符串 "CB3D9FD1"。

RTFM “L”和“I”以及其他参数的含义:https ://docs.python.org/2/library/struct.html

将 CRC 打包为长整数工作:你会得到 0 填充到 64 位(在我的 PC 上。YMMV)

>>> from struct import pack
>>> crc=0xcb3d9fd1
>>> repr(crc)
'3409813457'
>>> pack("L", crc)
'\xd1\x9f=\xcb\x00\x00\x00\x00'
>>> print crc
3409813457

也许你想使用 pack("I",...): 来获得 32bits

>>> 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
于 2016-06-14T15:05:16.740 回答