2014-09-11 96 views
4

我在使用struct.pack()打包整數時遇到了問題。python:來自struct pack的意外行爲()

隨着

struct.pack("BIB", 1, 0x1234, 0) 

我期待

'\x01\x00\x00\x034\x12\x00' 

而是我

'\x01\x00\x00\x004\x12\x00\x00\x00' 

我可能失去了一些東西在這裏。請幫忙。

回答

8
'\x01\x00\x00\x004\x12\x00\x00\x00' 
       ^this '4' is not part of a hex escape 

實際上是相同的:

'\x01\x00\x00\x00\x34\x12\x00\x00\x00' 

因爲用於ASCII碼 「4」 是0x34。

由於您使用了默認(native)格式,因此Python對數據使用了本機對齊方式,所以第二個字段對齊後偏移了4和3個零。

要得到的結果更喜歡你想要的東西,使用格式>BIB<BIB(分別爲大端或小端)這給你'\x01\x00\x00\x12\x34\x00''\x01\x34\x12\x00\x00\x00'。這些都不是你指定的內容,因爲你給出的例子不是正確的0x1234的大端或小端代表。

另請參閱:文檔中的第Byte Order, Size, and Alignment部分。

+0

燁,文檔:https://docs.python.org/2/library/struct.html#struct-alignment – 2014-09-11 11:07:01

2

docs

注意默認情況下,包裝在給定的C結構的結果包括填充字節,以保持爲C類型 涉及適當對準;同樣,開箱時要考慮到對齊。 選擇此行爲以使打包結構體 的字節與相應的C0結構的內存中的佈局完全對應。要處理獨立於平臺的數據格式或省略隱式填充字節,請使用標準大小和對齊,而不是原生大小和對齊:請參閱字節順序,大小和對齊以瞭解詳細信息。

你可以通過強制字節順序來得到你想要的結果。 (chr(0x34) == '4'

>>> struct.pack(">BIB", 1, 0x1234, 0) 
'\x01\x00\x00\x124\x00'