繁体   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