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