在Python中将ASCII数据转换为十六进制/二进制/字节

在Python中将ASCII数据转换为十六进制/二进制/字节,python,sockets,hex,Python,Sockets,Hex,我正在使用的设备的协议以逗号分隔的ASCII格式将UDP数据包发送到服务器(我的Python程序,使用twisted进行联网)。为了确认我的应用程序正确地收到了数据包,我必须从该数据包的报头中获取几个值,将它们转换成二进制并发送回。我把所有的东西都设置好了,虽然我似乎不知道二进制部分 我已经经历了很多事情,但我仍然感到困惑。文档显示为“二进制”,尽管它看起来更像十六进制,因为它说ACK数据包必须以“0xFE 0x02”开头 确认的格式要求我发送“0xFE 0x02”+8个无符号整数(IMEI编号

我正在使用的设备的协议以逗号分隔的ASCII格式将UDP数据包发送到服务器(我的Python程序,使用twisted进行联网)。为了确认我的应用程序正确地收到了数据包,我必须从该数据包的报头中获取几个值,将它们转换成二进制并发送回。我把所有的东西都设置好了,虽然我似乎不知道二进制部分

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

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

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

首先:

文档显示为“二进制”,尽管它看起来更像十六进制,因为它说ACK数据包必须以“0xFE 0x02”开头

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

所以,如果他们说“binary”,他们可能是指“binary”,十六进制就是他们向你展示你需要的二进制字节的方式


因此,您需要将数字的ASCII表示形式转换为实际数字,这是您使用函数所做的。然后,您需要将打包成8个字节,这是您使用模块所做的

你没有提到你需要大端还是小端。因为这听起来像是一个网络协议,而且听起来好像不是微软设计的,我猜是big-endian,但你应该知道,不是猜测

因此:

(您没有说序列号应该从何处获取,但无论序列号来自何处,您都将以相同的方式
打包它,只需使用
>H
而不是
>Q


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



最后一件事:因为您没有指定Python版本,所以我以一种与2.6+和3.0+兼容的方式编写了它;如果您需要使用2.5或更早版本,只需在
buf=
行中的文字上删除
b
前缀。

有帮助吗?请显示您的代码到目前为止尝试了什么?这很有效!我真的很感激你在一开始就澄清了关于十六进制/二进制的部分!
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