为什么 struct.pack return 这些值?

Why does struct.pack return these values?

我有一个带符号的 16 位整数数组,我想使用 python 中的 struct.pack 将其转换为小端字节串。但是我不明白,什么值struct.pack returns。这是一个例子:

>>> bytestr = struct.pack('<9h',*[45, 70, 33, 38, -6, 26, 34, 46, 57])
>>> bytestr
>>>> '-\x00F\x00!\x00&\x00\xfa\xff\x1a\x00"\x00.\x009\x00'

为什么会有这么多特殊字符,比如“!”要么 '&'?不应该是每个字节只有2个字符的字符串吗?

当 Python 向您显示字符串的表示形式时,它会始终尽可能向您显示可打印的文本。 -F!& 等是给定字节的可打印 ASCII 字符。

输出在其他方面完全正确。

  • 45,作为小端字节串,表示为0x2D 0x00 十六进制(十进制为45 00),但0x2D字节值也是- ASCII 字符集中的字符。

  • 70变成0x46 0x00,0x46就是ASCII中的字母F

  • 33变成0x21 0x00,0x21就是!

等等

如果你想验证这些值,你可以打印十六进制表示:

>>> bytestr.encode('hex')
'2d00460021002600faff1a0022002e003900'

或者您可以转换为 bytearray() object,然后转换为列表,以获得 0-255 范围内的整数列表:

>>> list(bytearray(bytestr))
[45, 0, 70, 0, 33, 0, 38, 0, 250, 255, 26, 0, 34, 0, 46, 0, 57, 0]

这些只是向您展示该字节字符串中存在哪些确切值的不同方式。