簡體   English   中英

如何讀取具有給定結構的多種數據類型的二進制文件

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM