用python解压缩结构化二进制数据

时间:2018-10-14 12:38:46

标签: python struct

我经常使用struct包来分析从C结构获取的二进制数据,但是在某些情况下我达到了此限制:

  • 当我的初始结构填充在32位架构上,而python安装在64位发行版上时
  • 使用结构树时
  • 当结构包含指针时(这也是32位和64位的问题)

所以我有时会手动获取我的数据,一个接一个struct.unpack_from('<one element>', ...),但是速度真的很慢!

鉴于这个事实,解决这个问题的最佳方法是什么,我能够生成一个文件,其中包含每个变量:名称,类型,大小和偏移量...

构建类似struct.unpack()的函数并采用这种任意描述是否容易?还是您有替代解决方案?

这是一个C代码的示例,它会产生有问题的情况:

#include <stdlib.h>
#include <stdio.h>
#include <inttypes.h>

typedef struct {
    uint32_t a;
    uint8_t b;
    float c;
} alpha_T;

typedef struct {
    uint32_t a; 
    int32_t * b;
    double c;
} beta_T;

typedef struct {
    alpha_T a;
    beta_T b;
} gamma_T;

typedef struct {
    uint32_t a_a;
    uint8_t a_b;
    float a_c;
    uint32_t b_a;   
    int32_t * b_b;
    double b_c;

} zeta_T;

int main() {
    gamma_T m;
    size_t p = (size_t) & m;

    printf("m.a.a @%ld\n", (size_t) &(m.a.a) - p);
    printf("m.a.b @%ld\n", (size_t) &(m.a.b) - p);
    printf("m.a.c @%ld\n", (size_t) &(m.a.c) - p);
    printf("m.b.a @%ld\n", (size_t) &(m.b.a) - p);
    printf("m.b.b @%ld\n", (size_t) &(m.b.b) - p);
    printf("m.b.c @%ld\n", (size_t) &(m.b.c) - p);

    zeta_T z;
    size_t n = (size_t) & z;

    printf("z.a_a @%ld\n", (size_t) &(z.a_a) - n);
    printf("z.a_b @%ld\n", (size_t) &(z.a_b) - n);
    printf("z.a_c @%ld\n", (size_t) &(z.a_c) - n);
    printf("z.b_a @%ld\n", (size_t) &(z.b_a) - n);
    printf("z.b_b @%ld\n", (size_t) &(z.b_b) - n);
    printf("z.b_c @%ld\n", (size_t) &(z.b_c) - n);
}

此输出为:

m.a.a @0
m.a.b @4
m.a.c @8
m.b.a @16
m.b.b @24
m.b.c @32

z.a_a @0
z.a_b @4
z.a_c @8
z.b_a @12
z.b_b @16
z.b_c @24

如果我使用普通的struct.Struct('IBfIpd'),则会错过m.a.cm.b.a之间的多余填充,我们可以看到平展的等效z的区别。

因此,我目前对m.b.a进行解码的解决方案是为m准备上一个表(类型为字母)并使用struct.unpack_from('I', 16, n)

0 个答案:

没有答案