[英]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.