为什么struct.pack会返回这些值?

时间:2016-09-02 15:05:29

标签: python struct pack

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

>>> 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'

为什么会有这些特殊字符,例如&#39;!&#39;或者&#39;&amp;&#39 ;?每个字节不应该只有一个2个字符的字符串吗?

1 个答案:

答案 0 :(得分:1)

当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]

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