首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人能解释一下Python struct解压吗?

有人能解释一下Python struct解压吗?
EN

Stack Overflow用户
提问于 2015-05-04 12:41:56
回答 2查看 10.4K关注 0票数 7

我有一个由C结构组成的二进制文件,我想用Python解析它。我知道二进制文件的确切格式和布局,但我不知道如何使用Python Struct解包来读取这些数据。

我是否必须遍历整个二进制文件,根据结构的成员一次解包一定数量的字节?

C文件格式:

代码语言:javascript
复制
typedef struct {
  int data1;
  int data2;
  int data4;
} datanums;

typedef struct {
  datanums numbers;
  char *name;
 } personal_data;

假设二进制文件有一个接一个的personal_data结构。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-04 12:59:53

假设布局是一个静态的二进制结构,可以用一个简单的struct模式来描述,而文件就是一个反复重复的结构,那么是的,“一次遍历整个二进制文件,一次解压一定数量的字节”正是您要做的。

例如:

代码语言:javascript
复制
record = struct.Struct('>HB10cL')

with open('myfile.bin', 'rb') as f:
    while True:
        buf = f.read(record.size)
        if not buf:
            break
        yield record.unpack(buf)

如果您担心一次只能读取17个字节的效率,并且希望通过一次缓冲8K或其他什么东西来解决这个问题,那么…首先,确保这是一个值得优化的实际问题;如果是这样,那么在unpack_from上而不是在unpack上循环。类似这样的代码(未经测试的、最重要的代码):

代码语言:javascript
复制
buf, offset = b'', 0
with open('myfile.bin', 'rb') as f:
    if len(buf) < record.size:
        buf, offset = buf[offset:] + f.read(8192), 0
        if not buf:
            break
    yield record.unpack_from(buf, offset)
    offset += record.size

或者,更简单的做法是,只要文件对于您的vmsize来说不是太大,就只需在mmap本身上对整个文件执行mmap并执行unpack_from

代码语言:javascript
复制
with open('myfile.bin', 'rb') as f:
    with mmap.mmap(f, 0, access=mmap.ACCESS_READ) as m:
        for offset in range(0, m.size(), record.size):
            yield record.unpack_from(m, offset)
票数 5
EN

Stack Overflow用户

发布于 2015-05-04 12:59:17

您可以一次打开几个包。让我们从这个例子开始:

代码语言:javascript
复制
In [44]: a = struct.pack("iiii", 1, 2, 3, 4)

In [45]: a
Out[45]: '\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00'

如果你正在使用一个字符串,你可以只使用它的一个子集,或者使用unpack_from:

代码语言:javascript
复制
In [49]: struct.unpack("ii",a[0:8])
Out[49]: (1, 2)
In [55]: struct.unpack_from("ii",a,0)
Out[55]: (1, 2)
In [56]: struct.unpack_from("ii",a,4)
Out[56]: (2, 3)

如果您使用的是缓冲区,则需要使用unpack_from

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30022749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档