我有一个带符号的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个字符的字符串吗?
答案 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]
这些只是向您展示该字节字符串中存在的确切值的不同方式。