struct.pack输出中字母的含义是什么?

时间:2012-09-03 06:17:26

标签: python pack

当我在python的struct模块中将数字更改为十六进制时,

>>> 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”的含义是什么?

3 个答案:

答案 0 :(得分:5)

你没有转换为十六进制。您将整数打包为二进制数据...在本例中为little-endian二进制数据。第一个字符只是原始字节的相应ASCII字符;例如89Y122z98b

  • 第一个pack'\x59\x00\x00\x00'生成0x00000059; '\x59''Y'
  • 第二个为'\x7a\x03\x00\x00'生成0x0000037a; '\x7a''z'
  • 第三个为'\x62\x07\x00\x00'生成0x00000762; '\x62''b'

请参阅以下ASCII表。

http://www.asciitable.com/index/asciifull.gif

答案 1 :(得分:3)

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

所以python正在打印文字字节串,有些字节可以表示为ASCII字符; 0x21-0x7E范围内的大多数字节都可以这样打印:

>>> '\x22'
'"'
>>> '\x50'
'P'

因此,'Y','z'和'b'是属于该范围的字节,python只是将它们打印为ASCII而不是\x转义:

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

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

答案 2 :(得分:1)

让我们逐行去 但首先我们必须了解little-endian格式和char值:
32位little-endian 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 /实数整数值