2012-09-03 30 views
0
當我換號入蟒結構模塊六角

struct.pack輸出中字母的含義是什麼?

>>> 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」的輸出意思?

回答

5

你不轉換爲十六進制。您將整數打包爲二進制數據......在這種情況下,是小端二進制數據。第一個字符只是原始字節的相應ASCII字符;例如89Y,122z98b

  • 第一pack產生'\x59\x00\x00\x00'0x00000059; '\x59''Y'
  • 第二個爲0x0000037a生產'\x7a\x03\x00\x00'; '\x7a''z'
  • 第三個產生'\x62\x07\x00\x00'0x00000762; '\x62''b'

請參閱下面的ASCII表格。

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

3

請注意,您不是轉換爲十六進制,而是將數據轉換爲原始字節。控制檯然後將這些字節回顯給你,以一種可以作爲python文字字符串再次輸入的形式。

所以python打印文字字節串,其中一些字節可以表示爲ASCII字符;在範圍最0x21-0x7E字節可以被打印爲這樣:

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

因此,「Y」,「Z」,和「b」是落入在該範圍內和python只是打印它們作爲ASCII而不是字節的\x逃逸:

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

你的字節的其餘部分屬於可打印的ASCII範圍之外,所以Python是代表這些作爲\xFF文字,這恰好使用16進制。

1

讓一行一行
但首先我們要了解小端格式和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 /實數整數值

相關問題