1

当我在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”是什么意思?

4

3 回答 3

5

您没有转换为十六进制。您将整数打包为二进制数据......在这种情况下,是小端二进制数据。第一个字符只是原始字节对应的 ASCII 字符;例如89Y122z98b

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

请参阅下面的 ASCII 表。


(来源:asciitable.com

于 2012-09-03T06:20:25.257 回答
3

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

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

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

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

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

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

于 2012-09-03T06:20:08.127 回答
2

让我们逐行进行,
但首先我们必须了解 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 /实整数值

于 2012-09-03T06:52:03.943 回答