簡體   English   中英

python struct unpack length錯誤

[英]python struct unpack length error

我有一個長度為41的字節對象。我嘗試用以下方法打開它的包裝:

struct.unpack('2B2B32sBi',data)

但是我得到一個錯誤:

struct.error:解壓縮需要一個長度為44的字節對象

我認為2B2B32sBi的長度應在檢查python文檔后為2*1+2*1+32*1+1+4=41 我為什么錯了?

請參閱文檔中有關對齊的部分:

默認情況下,C類型以機器的本機格式和字節順序表示,並在必要時通過跳過填充字節來正確對齊(根據C編譯器使用的規則)。

使用C編譯器的sizeof表達式確定本機大小和對齊方式。 這始終與本機字節順序結合在一起。

注意'@'和'='之間的區別:兩者都使用本機字節順序,但是后者的大小和對齊方式是標准化的。

為了說明這一點:

>>> import struct
>>> struct.calcsize("2B2B32sBi")
44
>>> struct.calcsize("@2B2B32sBi")
44
>>> struct.calcsize("=2B2B32sBi")
41

您剛遇到填充是因為先獲取字節數據,然后獲取整數(具有更強的對齊約束)

文檔中

僅在連續的結構成員之間自動添加填充。 在編碼結構的開頭或結尾不添加填充。

因此,您必須指定字節序以禁用填充:

struct.unpack('<2B2B32sBi',data)

閱讀了Galen的出色答案后, 為了完整起見,對其進行了編輯 :如果不想強制字節序,僅指定=會更好。

您可能需要再次閱讀struct文檔中的第一條注釋。 默認值是C對齊的數據邊界,因此一些填充字節是造成差異的原因。 因此,添加適當的字節順序應該可以解決該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM