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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Python 3中将十六进制字符串(python 2)转换为带有十六进制数字的字节相关的知识,希望对你有一定的参考价值。

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

答案

我猜你正在创建一个"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'xaax00x01x00x00x00ex00x00x00
x00oq'

以上是关于在Python 3中将十六进制字符串(python 2)转换为带有十六进制数字的字节的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 3 中将二进制字符串转换为字节数组

如何在 Python 中将字符串转换为十六进制整数?

如何在Python中将十六进制字符串转换为ObjectId [重复]

在python中将字符串转换为十六进制

如何在 Python 中将十六进制转换为十进制? [复制]

在 Python 中将十六进制字符串转换为字节列表