[英]How to read a binary file with multiple data types with a given structure
我從來沒有在python中處理過多個數據類型的二進制文件。 我希望我能得到一些方向。 二進制文件包含以下數據類型:
串
字節
UInt8 -Size in bytes:1-8位無符號整數。
UInt16 -Size in bytes:2- Little-endian編碼的16位無符號整數。
UInt32 -Size in bytes:4- Little-endian編碼的32位無符號整數。
UInt64 -Size in bytes:8- Little-endian編碼的64位無符號整數。
我一直沒做的就是正確解碼我的數據。 數據包含一種通用消息格式,用作提供一個或多個更高級別消息的包裝器。 我在下面提供了這個包裝器中包含的字段名稱。
在此消息中,我可以:
長度 - 偏移0 - 大小2 - 類型UInt16
消息計數 - 偏移2 - 大小1-類型UInt8
ID - 偏移3 - 大小1 - 類型字節
序列 - 偏移4 - 大小4 - 類型UInt32
有效負載 - 抵消8
如果length指定公共消息的長度,則消息計數將告知在Payload中將開始多少更高級別的消息。
更高級別的消息在Payload中開始,具有以下特征
消息長度 - 0 - 大小1 - 鍵入UInt8
消息類型 - 偏移1 - 大小1 - 類型字節
一旦我能夠弄清楚每個更高級別消息中的消息類型是什么,其余的都是微不足道的。 我一直在嘗試創建一個類BinaryReader來為我做這個,我還沒有成功使用struct.unpack。
編輯:這是常見消息的示例
(7倍\\ xecM \\ X00 \\ X00 \\ X00 \\ X00 \\ X15。\\ X90 \\ XF1 \\ xc64CIDM')
和里面的更高級別的消息
( 'C \\ x01dC \\ x02H \\ X00 \\ X15。\\ xe8 \\ XF3 \\ xc64CIEN')
Construct是一個很好的解析二進制數據的庫。
您可能會使用以下內容:
from construct import *
message = Struct("wrapper",
UBInt16("length"),
UBInt8("count"),
Byte("id"),
UBInt32("sequence"),
Array(lambda ctx: ctx.length,
Struct("message",
UBInt8("length"),
UBInt8("type"),
Bytes("content", lambda ctx: ctx.length),
),
),
)
我想你可以在Python上使用bitsrting模塊http://code.google.com/p/python-bitstring/
它為您提供了一些很好的功能,包括二進制數據的格式字符串。
在這里,您可以找到更多有關讀取數據和格式化字符串
http://pythonhosted.org/bitstring/reading.html#reading-using-format-strings
http://pythonhosted.org/bitstring/constbitstream.html#bitstring.ConstBitStream.read
http://pythonhosted.org/bitstring/constbitstream.html#bitstring.ConstBitStream.readlist
此代碼可能會讓您了解使用bitstring的解決方案。
from bitstring import BitStream
bs = BitStream(your_binary_data)
length, message_count, id, sequence = bs.readlist('uintle:16, uintle:8, bytes:1, uintle:32')
payload = bs[:bs.pos]
message_length, message_type = payload.readlist('uintle:8, bytes:1')
rest_of_data = payload[:payload.pos]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.