我在使用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'
我可能失去了一些東西在這裏。請幫忙。
我在使用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'
我可能失去了一些東西在這裏。請幫忙。
'\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部分。
從docs
注意默認情況下,包裝在給定的C結構的結果包括填充字節,以保持爲C類型 涉及適當對準;同樣,開箱時要考慮到對齊。 選擇此行爲以使打包結構體 的字節與相應的C0結構的內存中的佈局完全對應。要處理獨立於平臺的數據格式或省略隱式填充字節,請使用標準大小和對齊,而不是原生大小和對齊:請參閱字節順序,大小和對齊以瞭解詳細信息。
你可以通過強制字節順序來得到你想要的結果。 (chr(0x34)
== '4'
)
>>> struct.pack(">BIB", 1, 0x1234, 0)
'\x01\x00\x00\x124\x00'
燁,文檔:https://docs.python.org/2/library/struct.html#struct-alignment – 2014-09-11 11:07:01