Python网络转换器

2024-10-01 13:37:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

谢谢!在


Tags: 字符串网络协议buffer方式ascii数据包校验
3条回答

如果已将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上)

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

也许你想用pack(“I”,…):得到32位

^{pr2}$

如果尝试用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

实际上,不要把你的CRC转换成ASCII。保持十六进制,然后使用struct.pack将其压缩为字节字符串:

buffer += struct.pack("L", crc)

相关问题 更多 >