当我在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”是什么意思?
您没有转换为十六进制。您将整数打包为二进制数据......在这种情况下,是小端二进制数据。第一个字符只是原始字节对应的 ASCII 字符;例如89
是Y
、122
是z
、98
是b
。
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)
请注意,您没有转换为十六进制,而是将数据转换为原始字节。然后控制台会将这些字节回显给您,其形式可以再次作为 python 文字字符串输入。
所以python正在打印文字字节字符串,其中一些字节可以表示为ASCII字符;0x21-0x7E 范围内的大多数字节都可以这样打印:
>>> '\x22'
'"'
>>> '\x50'
'P'
因此,“Y”、“z”和“b”是属于该范围的字节,python 只是将它们打印为 ASCII 而不是\x
转义:
>>> '\x59'
'Y'
>>> '\x62'
'b'
>>> '\x7a'
'z'
其余字节超出可打印的 ASCII 范围,因此 python 将它们表示为\xFF
文字,恰好使用十六进制表示法。
让我们逐行进行,
但首先我们必须了解 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 /实整数值