2016-05-14 38 views
-1

我是Python新手(我正在使用Python3)和一般編程。您能否提供關於pack和unpack如何在python中產生答案的詳細解釋;我知道使用這兩種函數的語法,但我不明白答案是如何計算的。舉例來說,我不明白爲什麼下面的代碼:在Python中打包和解壓縮位和字節

L = struct.pack('f', 255) print([ii for ii in L])

將產生如下輸出(尤其是爲什麼有127和67):

[0, 0, 127, 67]

還有,爲什麼以下代碼:

LL = struct.unpack('i', b'0000') print(LL)

會產生ŧ他以下號碼:

(808464432,)

感謝您的幫助。

+1

如果你是Python的新手,而且完全是編程新手,對於初學者來說,打包'struct's是一個痛苦的選擇。嘗試從簡單的事情開始,比如一個程序,告訴你一個值範圍內的每個數字是可以被3,5或者這兩個數字整除(俗稱「FizzBu​​zz」)。 – TigerhawkT3

回答

3

在第一種情況下,您會看到組成32bit floating point number的4個字節的十進制值。

在您的具體示例中,浮點數255.0在內存中表示爲4個字節,其中十六進制值爲43 7f 00 00。由於您使用的是little-endian平臺,因此您首先會看到最低有效字節。因此,換算成字節的列表,你有

[ 0x00, 0x00, 0x7f, 0x43 ] 

轉換爲十進制值,你獲得

[0, 0, 127, 67] 

在第二種情況下,你試圖解釋的b'0000'結果。

>>> type(b'0000') 
<class 'bytes'> 
>>> len(b'0000') 
4 

正如你可以看到,這個表達式返回的4個字節的序列,所以在這種情況下,這將是字符0的4個實例的序列。

>>> '%x' % ord('0') 
'30' 

字符0的值是十六進制0x30。解釋爲32位整數的4個字節相當於0x30303030的十六進制值。

>>> 0x30303030 
808464432 

當我們用十進制來寫這個值時,我們獲得808464432