我经常使用struct
包来分析从C结构获取的二进制数据,但是在某些情况下我达到了此限制:
所以我有时会手动获取我的数据,一个接一个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.c
和m.b.a
之间的多余填充,我们可以看到平展的等效z的区别。
因此,我目前对m.b.a进行解码的解决方案是为m准备上一个表(类型为字母)并使用struct.unpack_from('I', 16, n)