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

问题描述 投票:0回答:1

我正在转换我的代码,因此它适用于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值)。这在技术上是正确的,但我只想将字符串转换为字节而不更改任何值。有任何建议/解决方法可以进行此转换吗?

python-3.x encoding type-conversion hex byte
1个回答
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'
© www.soinside.com 2019 - 2024. All rights reserved.