在Python 3中将十六进制字符串(python 2)转换为带有十六进制数字的字节

时间:2018-03-01 13:18:54

标签: python-3.x encoding type-conversion hex byte

我正在转换我的代码,因此它适用于Python 3.剩下的主要问题是成功使用serial.write命令。在我之前的代码中,我创建了一个这样的字符串: read_frame = '\ XAA \ X00 \ X01 \ X00 \ X00 \ X00 \ X65 \ X00 \ X00 \ X00 \ X0A \ X00 \ x6F \ X71'。然后使用serial.write(read_frame)发送此字符串。

但是,在Python 3中,我必须将其转换为'byte'才能使用serial.write(read_frame)。如果它是静态帧,则将其声明为: read_frame_byte = B '\ XAA \ X00 \ X01 \ X00 \ X00 \ X00 \ X65 \ X00 \ X00 \ X00 \ X0A \ X00 \ x6F \ X71'

然而,问题是我动态创建了这个十六进制字符串,所以最后我必须将字符串转换为字节。如果我使用命令read_frame.encode('utf-8'),转换会产生不同的十六进制数(例如,x65变为xe,因为这是相应的ASCII值)。这在技术上是正确的,但我只想将字符串转换为字节而不更改任何值。有任何建议/解决方法可以进行此转换吗?

1 个答案:

答案 0 :(得分:0)

我猜你正在创建一个"AA0001000000650000000A006F71"形式的十六进制字符串,并且你想从每对十六进制数字创建一个字节。我不应该猜...

获取您的数据:

>>> digits = "AA0001000000650000000A006F71"

将其拆分为两个字符的块:

>>> [digits[i:i+2] for i in range(0, len(digits), 2)]
['AA', '00', '01', '00', '00', '00', '65', '00', '00', '00', '0A', '00', '6F', '71']

将转换添加到整数,告诉int内置使用base 16:

>>> [int(digits[i:i+2], 16) for i in range(0, len(digits), 2)]
[170, 0, 1, 0, 0, 0, 101, 0, 0, 0, 10, 0, 111, 113]

最后,将整数列表转换为bytes对象:

>>> bytes([int(digits[i:i+2], 16) for i in range(0, len(digits), 2)])
b'\xaa\x00\x01\x00\x00\x00e\x00\x00\x00\n\x00oq'