gpt4 book ai didi

python - 如何读取具有给定结构的多种数据类型的二进制文件

转载 作者:太空狗 更新时间:2023-10-30 03:03:26 24 4
gpt4 key购买 nike

我从来没有在 python 中处理过具有多种数据类型的二进制文件。我希望我能得到一些指导。二进制文件包含以下数据类型:

字符串
字节
UInt8 - 字节大小:1- 8 位无符号整数。
UInt16 - 以字节为单位的大小:2- Little-endian 编码的 16 位无符号整数。
UInt32 - 大小(以字节为单位):4- Little-endian 编码的 32 位无符号整数。
UInt64 - 大小(以字节为单位):8- Little-endian 编码的 64 位无符号整数。

我一直未能成功地正确解码我的数据。数据包含一种通用消息格式,用作传递一个或多个更高级别消息的包装器。我在下面提供了此包装器中包含的字段名称。

在这条消息中我可以有:
长度 - 偏移量 0 - 尺寸 2 - 类型 UInt16
消息计数 - 偏移量 2 - 大小 1 - 类型 UInt8
ID - 偏移量 3 - 大小 1 - 类型字节
序列 - 偏移量 4 - 大小 4 - 类型 UInt32
有效载荷-偏移量 8

在长度指定公共(public)消息的长度的地方,消息计数表明有多少更高级别的消息将在有效负载中开始。

更高级别的消息从 Payload 开始,具有以下特征

消息长度 - 0 - 大小 1 - 类型 UInt8
消息类型 -​​ 偏移量 1 - 大小 1 - 类型字节

一旦我能够弄清楚每个更高级别的消息中的消息类型是什么,剩下的就很简单了。我一直在尝试创建一个 BinaryReader 类来为我执行此操作,但我无法成功使用 struct.unpack。

编辑:这是常见消息的示例
('7x\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 - 如何读取具有给定结构的多种数据类型的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19000841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com