>>> 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」的輸出意思?
>>> 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'
爲0x00000059
; '\x59'
是'Y'
。0x0000037a
生產'\x7a\x03\x00\x00'
; '\x7a'
是'z'
。'\x62\x07\x00\x00'
爲0x00000762
; '\x62'
是'b'
。請參閱下面的ASCII表格。
請注意,您不是轉換爲十六進制,而是將數據轉換爲原始字節。控制檯然後將這些字節回顯給你,以一種可以作爲python文字字符串再次輸入的形式。
所以python打印文字字節串,其中一些字節可以表示爲ASCII字符;在範圍最0x21-0x7E字節可以被打印爲這樣:
>>> '\x22'
'"'
>>> '\x50'
'P'
因此,「Y」,「Z」,和「b」是落入在該範圍內和python只是打印它們作爲ASCII而不是字節的\x
逃逸:
>>> '\x59'
'Y'
>>> '\x62'
'b'
>>> '\x7a'
'z'
你的字節的其餘部分屬於可打印的ASCII範圍之外,所以Python是代表這些作爲\xFF
文字,這恰好使用16進制。
讓一行一行
但首先我們要了解小端格式和char值:
32位小尾數 INT的右側有
最顯著位所以內存十六進制(0x01,0x02,0x03,0x04)的值確實是(0x04,0x03,0x02,0x01)
char值'Y'= 0x59 = 89,'z'= 0x7a = 122, 'b'= 0x62 = 98
'Y \ X00 \ X00 \ X00'= 0×59,0x00時,0×00,0×00 /數據在存儲器
'Y \ X00 \ X00 \ X00'= 0x00000059 = 89 /實整數值
「Z \ X03 \ X00 \ X00' = 0x7a,0x03時,0×00,0×00 /數據在存儲器
'Z \ X03 \ X00 \ X00'= 0x0000037a = 890 /實整數值
「b \ X0B \ X07 \ x00'= 0x62,0x07,0x00,0x00 /內存中的數據
'b \ x0b \ x07 \ x00'= 0x00000762 = 1890 /實數整數值