Python struct.pack输出中的字母是什么意思?

Python struct.pack输出中的字母是什么意思?,python,pack,Python,Pack,当我在python的结构模块中将数字改为十六进制时 >>> import struct >>> struct.pack("i",89) 'Y\x00\x00\x00' >>> struct.pack("i",890) 'z\x03\x00\x00' >>> struct.pack("i",1890) 'b\x07\x00\x00' 输出中“Y,z,b”的含义是什么?请注意,您不是在转换为十六进制,而是在将数据转换为原始字节

当我在python的结构模块中将数字改为十六进制时

>>> import struct
>>> struct.pack("i",89)
'Y\x00\x00\x00'
>>> struct.pack("i",890)
'z\x03\x00\x00'
>>> struct.pack("i",1890)
'b\x07\x00\x00'

输出中“Y,z,b”的含义是什么?

请注意,您不是在转换为十六进制,而是在将数据转换为原始字节。然后,控制台将这些字节以可以作为python文本字符串再次输入的形式返回给您

因此python正在打印文本字节字符串,其中一些字节可以表示为ASCII字符;0x21-0x7E范围内的大多数字节可以按如下方式打印:

>>> '\x22'
'"'
>>> '\x50'
'P'
因此,“Y”、“z”和“b”是属于该范围的字节,python只是将它们打印为ASCII而不是转义:

>>> '\x59'
'Y'
>>> '\x62'
'b'
>>> '\x7a'
'z'

其余的字节不在可打印的ASCII范围内,因此python将这些字节表示为
\xFF
文本,它恰好使用十六进制表示法。

您没有转换为十六进制。您正在将整数打包为二进制数据。。。在本例中,使用小的endian二进制数据。第一个字符只是原始字节对应的ASCII字符;e、 g.
89
Y
122
z
98
b

  • 第一个
    pack
    0x00000059
    生成
    '\x59\x00\x00\x00'
    <代码>'\x59'是
    'Y'
  • 第二个为
    0x0000037a
    生成
    '\x7a\x03\x00\x00'
    <代码>'\x7a'是
    'z'
  • 第三个为
    0x00000762
    生成
    '\x62\x07\x00\x00'
    <代码>'\x62'是
    'b'
请参见下面的ASCII表


(来源:)

让我们一行一行地走吧
但首先我们必须了解little endian格式和字符值:
32位小尾数int在右边有最高有效位
所以内存中十六进制(0x01,0x02,0x03,0x04)的值实际上是(0x04,0x03,0x02,0x01)
字符值Y'=0x59=89,'z'=0x7a=122,'b'=0x62=98

“Y\x00\x00\x00'=0x59,0x00,0x00,0x00/内存中的数据
'Y\x00\x00\x00'=0x00000059=89/实整数值

'z\x03\x00\x00'=0x7a、0x03、0x00、0x00/内存中的数据
'z\x03\x00\x00'=0x0000037a=890/实整数值

“b\x0b\x07\x00”=0x62、0x07、0x00、0x00/内存中的数据
'b\x0b\x07\x00'=0x00000762=1890/实整数值