将整数转换为一对字节产生意外格式?



我使用python 3.8.5,并试图从(0,65535)范围内的整数转换为一对字节。我目前正在使用以下代码:

from struct import pack
input_integer = 2111
bytes_val = voltage.to_bytes(2,'little')
output_data = struct.pack('bb',bytes_val[1],bytes_val[0])
print(output_data)

这会产生以下输出:b'x08?'

This x08在十六进制中是8,是最高位字节,并且?是63的ascii格式。所以,这些数字加起来是2111(8*256+63=2111)。我不明白的是为什么最低有效位字节是ascii而不是十六进制?对我来说很奇怪,它的格式与旁边的MSB不同。我希望它在十六进制输出数据,并试图找出如何实现这一目标。

我也尝试修改最后一行的格式字符串如下:

output_data = struct.pack('cc',bytes_val[1],bytes_val[0])

会产生以下错误:

struct.error: char format requires a bytes object of length 1

我检查了每一步的类型,看起来bytes_val是一个长度为2的字节数组,但是当我取其中一个单独的元素时,比如bytes_val[1],它是一个整数而不是字节数组。

任何想法?

您的所有观察结果都可以从bytes类的文档中验证:

虽然bytes字面值和表示基于ASCII文本,但bytes对象实际上表现为不可变的整数序列

在Python字符串中,任何字母和标点符号在ASCII中由它们自己表示,而任何控制代码由它们的十六进制值(0- 31,127)表示。你可以通过打印''.join(map(chr, range(128)))看到这一点。字节字面值遵循相同的约定,除了单个字节元素是整数,即output_data[0]

如果你想用十六进制表示

>>> output_data.hex()
'083f'
>>> bytes.fromhex('083f') # to recover
b'x08?'

从3.8版本开始,bytes.hex()现在支持可选的sepbytes_per_sep参数,以在十六进制输出的字节之间插入分隔符。

>>> b'abcdef'.hex(' ', 2)
'6162 6364 6566'

最新更新