Python 网络转换字节



我正在尝试在基于网络的协议上实现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

最新更新