我試圖設計一個系統來對不同的二進制標誌作出反應。Python的結構錯誤
0 = Error
1 = Okay
2 = Logging
3 = Number
該數據的序列表示引用工作,標誌和編號的唯一ID。除了號碼標誌以外,一切正常。這是我得到...
>>> import struct
>>> data = (1234, 3, 12345678)
>>> bin = struct.pack('QHL', *data)
>>> print(bin)
b'\xd2\x04\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00Na\xbc\x00\x00\x00\x00\x00'
>>> result = struct.unpack_from('QH', bin, 0)
>>> print(result)
(1234, 3)
>>> offset = struct.calcsize('QH')
>>> result += struct.unpack_from('L', bin, offset)
>>> print(result)
(1234, 3, 7011541669862440960)
長應該是足夠大的代表人數12345678
,但爲什麼它不正確解壓?
編輯:
當我嘗試獨立包裝,看起來結構是將國旗和長期之間存在太多的空字節。
>>> import struct
>>> struct.pack('QH', 1234, 3)
b'\xd2\x04\x00\x00\x00\x00\x00\x00\x03\x00'
>>> struct.pack('L', 12345678)
b'Na\xbc\x00\x00\x00\x00\x00'
我可以通過在長時間之前添加填充來重現此錯誤。
>>> struct.unpack('L', struct.pack('L', 12345678))
(12345678,)
>>> struct.unpack('xL', struct.pack('xL', 12345678))
(12345678,)
>>> struct.pack('xL', 12345678)
b'\x00\x00\x00\x00\x00\x00\x00\x00Na\xbc\x00\x00\x00\x00\x00'
可能的修復?
當我使用小端順序時,問題似乎自行糾正,並使二進制字符串更短。由於這是一個SSL封裝的TCP套接字,這是一個雙贏,對吧?保持低帶寬通常很好,是嗎?
>>> import struct
>>> data = (1234, 3, 12345678)
>>> bin = struct.pack('<QHL', *data)
>>> print(bin)
b'\xd2\x04\x00\x00\x00\x00\x00\x00\x03\x00Na\xbc\x00'
>>> result = struct.unpack_from('<QH', bin, 0)
>>> print(result)
(1234, 3)
>>> offset = struct.calcsize('<QH')
>>> result += struct.unpack_from('<L', bin, offset)
>>> print(result)
(1234, 3, 12345678)
爲什麼會發生這種情況?我很困惑。
您不關心它是否打開包裝太不正確? –
@CaptPlanet我不知道如何測試。你能解釋一下嗎? – bkvaluemeal
我的意思是說你已經提供瞭解壓輸出(1234,1)和(1234,1,7011541669862440960),其中標誌值應該是3.我猜測這是一個錯字。 –