2017-09-13 26 views
0

我想從二進制文件中解壓結構,我知道前4個字節是一個整數(值爲64),接下來的3 * 8字節是三個雙精度值。我已經存儲的數據在一個名爲fileContent這樣的載體:Python結構解壓縮整數後加雙精度

with open('data', mode='rb') as file: 
    fileContent = file.read() 

然後我嘗試:

print(struct.unpack("i", fileContent[0:4])) 

這正確打印數量64。然而,我想也可以參考下面的雙所以我修改聲明上面

print(struct.unpack("id", fileContent[0:12])) 

(因爲整數應該是4個字節,並且雙應該是8位,產生總共12個字節)。不過,我得到一個錯誤,指出

struct.error: unpack requires a bytes object of length 16

另外,如果我嘗試讀取雙只及用途:

print(struct.unpack("d", fileContent[4:12]) 

我沒有得到雙重的正確值!將上面的切片更改爲[8:16]會給出正確的值。有人可以解釋這個嗎?我確信文件中的前4個字節應該是一個整數,接下來的8個字節應該是一個整數。 read()以某種方式填充整數爲零,或發生了什麼?

+0

您的輸入結構可能被填充,因此'double'對齊8個字節。 –

+0

我在終端中做了一個二進制轉儲,並且輸入文件'data'沒有被填充(考慮到在小端機器上,前四個字節是01000000 00000000 00000000 00000000)並且後面的字節非零,並且I認爲他們代表了浮動。 read()函數是否會自動填充數據? – JezuzStardust

回答

0

unpack()會自動爲你填充。所以unpack('id', …)會將整數填充到8個字節,這就是爲什麼你會得到「struct.error:unpack需要長度爲16的字節對象」的錯誤。

它可以很容易地看到這樣的:

>>> pack('id', 42, 42) 
b'*\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\[email protected]' 

但解決辦法是容易的,因爲你知道文件的存儲方式,你應該指定它,並通過specifing它,填充將被禁用:

>>> unpadded = pack('>id', 42, 42) 
>>> len(unpadded) 
12 
>>> unpack('>id', unpadded) 
(42, 42.0)