当我在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”的含义是什么?
答案 0 :(得分:5)
你没有转换为十六进制。您将整数打包为二进制数据...在本例中为little-endian二进制数据。第一个字符只是原始字节的相应ASCII字符;例如89
为Y
,122
为z
,98
为b
。
pack
为'\x59\x00\x00\x00'
生成0x00000059
; '\x59'
是'Y'
。'\x7a\x03\x00\x00'
生成0x0000037a
; '\x7a'
是'z'
。'\x62\x07\x00\x00'
生成0x00000762
; '\x62'
是'b'
。请参阅以下ASCII表。
答案 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 /实数整数值