Python网络转换字节

时间:2011-12-29 19:15:53

标签: python networking encoding byte utf-16le

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

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

谢谢!

3 个答案:

答案 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