【问题标题】:Convert ASCII data to hex/binary/bytes in Python在 Python 中将 ASCII 数据转换为十六进制/二进制/字节
【发布时间】:2015-08-05 04:32:15
【问题描述】:

我正在使用的设备的协议以逗号分隔的 ASCII 格式将 UDP 数据包发送到服务器(我的 Python 程序,使用twisted 网络)。为了确认我的应用程序正确接收了数据包,我必须从该数据包的标头中获取几个值,将它们转换为二进制并将它们发回。我已经完成了所有设置,但我似乎无法弄清楚二进制部分。

我经历了很多事情,但我仍然感到困惑。文档说“二进制”,尽管它看起来更像十六进制,因为它说 ACK 数据包必须以“0xFE 0x02”开头。

确认的格式要求我发送“0xFE 0x02”+一个8位无符号整数(IMEI号,15位)+2字节无符号整数(Sequence ID)

如何将我拥有的 ASCII 文本值转换为“二进制”?

【问题讨论】:

  • this 有帮助吗?
  • 请展示您的代码到目前为止您尝试了什么?

标签: python sockets hex


【解决方案1】:

第一:

文档说“二进制”,虽然它看起来更像是十六进制,因为它说 ACK 数据包必须以“0xFE 0x02”开头。

嗯,不可能以人类可读的形式打印实际的二进制数据,因此文档通常会给出一个十六进制字节序列。他们可以使用 bytes 文字,如 b'\xFE\x02' 或其他东西,但这对于人类读者来说仍然是有效的十六进制,对吧?

所以,如果他们说“二进制”,他们的意思可能是“二进制”,而十六进制就是他们向您显示您需要的二进制字节的方式。


因此,您需要将数字的 ASCII 表示形式转换为实际数字,您可以使用 int 函数执行此操作。然后你需要将 pack 转换成 8 个字节,你可以使用 struct 模块。

你没有提到你需要大端还是小端。因为这听起来像是一个网络协议,而且听起来它不是由 Microsoft 设计的,所以我会猜测 big-endian,但实际上你应该知道,而不是猜测。

所以:

imei_string = '1234567890123456789'
imei_number = int(imei_string) # 1234567890123456789
imei_bytes = struct.pack('>Q', imei_number) # b'\x11\x22\x10\xf4\x7d\xe9\x81\x15'
buf = b'\xFE\x02' + imei_bytes + seq_bytes

(你没有说你应该从哪里得到序列号,但无论它来自哪里,你都会用同样的方式pack,只是使用>H而不是>Q。)


如果您确实确实需要一个十六进制字符串而不是二进制,那么您需要确切地知道什么格式。 binascii.hexlify 函数为您提供“裸十六进制”,每个字节两个字符,没有 0x 或其他页眉或页脚。如果您想要不同的东西,那取决于您到底想要什么;没有格式真的那么难。但是,我很确定您在这里不需要十六进制字符串。


最后一件事:由于您没有指定 Python 版本,因此我以与 2.6+ 和 3.0+ 兼容的方式编写了此代码;如果您需要使用 2.5 或更早版本,只需将 b 前缀放在 buf = 行中的文字上即可。

【讨论】:

  • 这成功了!非常感谢您在开始时也澄清了有关十六进制/二进制的部分!
猜你喜欢
  • 2012-11-14
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2020-02-26
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多