在Python中将十六进制字符串转换为字节时出现问题

时间:2019-03-28 09:38:21

标签: python python-3.x hex

我无法将字符串转换为字节。

我尝试将十六进制格式的字符串('55 55 00 00')转换为字节,然后通过Pyserial发送这些字节,但是我发现字符串转换为字节时出错。我的代码是:

msg = '55 55 00 00'

bytes.fromhex(msg)

我希望结果应该是b'\0x55\0x55\0x00\0x00',为什么会是结果
b'UU\x00\x00'

什么是UU

2 个答案:

答案 0 :(得分:0)

0x55与字母U的ASCII码相同。因此,Python做正确的事。 看到这种情况的一种方法是:

b'\x55' == b'U'
True

答案 1 :(得分:0)

您已正确地将msg字符串转换为Python 3的bytes字符串/对象。您只是从其控制台打印中感到困惑。 bytes对象实际上是一个短整数序列,尽管会尽可能将其内容打印为字符。

要检查以下内容:

In [49]: msg = '55 55 00 00'
In [50]: values = bytes.fromhex(msg)
In [51]: values
Out[51]: b'UU\x00\x00' # U == \0x55 == 85
In [52]: values[0]
Out[52]: 85
In [53]: [value for value in values]
Out[53]: [85, 85, 0, 0]

注意:此处85 == 0x55可以打印为U

如果无法将某些内容打印为字符,则将其打印为转义的十六进制值,请检查以下内容:

In [54]: bytes("aÄBèC", sys.getdefaultencoding())
Out[54]: b'a\xc3\x84B\xc3\xa8C'

此外,要以所需格式打印,必须显式编写代码以进行打印:-

"".join(["0x{:02x}".format(value) for value in values])