有人可以解释Python结构解包吗?

use*_*478 7 python binary parsing struct

我有一个由C结构构成的二进制文件,我想在Python中进行解析.我知道二进制文件的确切格式和布局,但我对如何使用Python Struct解包来读取这些数据感到困惑.

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

C文件格式:

typedef struct {
  int data1;
  int data2;
  int data4;
} datanums;

typedef struct {
  datanums numbers;
  char *name;
 } personal_data;
Run Code Online (Sandbox Code Playgroud)

让我们说二进制文件具有一个接一个地重复的personal_data结构.

aba*_*ert 5

假设布局是一个静态二进制结构,可以通过一个简单的struct模式来描述,而文件就是那个结构一遍又一遍地重复,那么是的,"遍历整个二进制文件,一次解包一定数量的字节"你要做什么

例如:

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)
Run Code Online (Sandbox Code Playgroud)

如果你担心一次只能读取17个字节的效率,并且你想通过一次缓冲8K来解决这个问题......那么,首先要确保它是一个值得优化的实际问题; 然后,如果是,则循环unpack_from而不是unpack.像这样的东西(未经测试,我的头顶代码):

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
Run Code Online (Sandbox Code Playgroud)

或者,就更简单了,只要该文件不是太大,你vmsize,只是mmap整个事情,unpack_frommmap本身:

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)
Run Code Online (Sandbox Code Playgroud)