【发布时间】:2020-03-13 17:35:12
【问题描述】:
我正在使用 Python 库与传感器进行 ANT+ 无线通信。 通信是通过与一个 4-5 位数字长的 ID 配对来完成的。 在我测试的其中一台设备的 ID 为“00625”之前,一切正常。
跟踪代码,问题的根源是用于对ANT+协议消息的字节进行编码和解码的struct pack/unpack函数。
>>> from struct import *
>>> pack(b'<H', 11977)
'\xc9.'
>>> unpack(b'<H', '\xc9.')
(11977,)
>>> pack(b'<H', 625)
'q\x02'
>>> unpack(b'<H', 'q\x02')
(625,)
>>> pack(b'<H', 00625)
'\x95\x01'
>>> unpack(b'<H', '\x95\x01')
(405,)
所以,当我将 ANT ID 的 11977 或 625 打包然后打开包装时,我得到的正是我打包的东西。
但是,当我打包 ANT ID 00625 然后打开它时,我得到了 405。 不知道我该如何处理这个问题,以便我可以正确打包 00625。
【问题讨论】:
-
是否可以先将00625打包成字符串'00625',再解包结果?
-
@JYCH 不,扔掉
struct.error: cannot convert argument to integer。 -
在 Python 中,十进制整数文字中的前导零是不允许的。您将需要以某种方式将它们剥离。带有
00625文字的代码的来源是什么? -
您必须使用 Python 2。带有前导零的整数文字被视为 八进制。在 Python 3 中,这已被删除,但
0o前缀仍然存在。无论如何,你是如何把这个整数放到你的代码中的?最终这就是问题所在,而不是struct.pack。如果它以字符串形式出现,您应该使用int(),而不是eval(),和raw_input(),而不是input()。
标签: python struct endianness pack leading-zero