在 Python 中解压嵌套的 C 结构

jpf*_*der 6 python struct nested unpack

我正在尝试解压一个 C 结构,该结构以二进制形式传递给我的 Python 程序,并包含另一个嵌套结构。C 标头的相关部分如下所示:

typedef struct {
    uint8_t seq;
    uint8_t type;
    uint16_t flags;
    uint16_t upTimestamp;
}__attribute__ ((packed)) mps_packet_header;

typedef struct {
    mps_packet_header header;
    int16_t x[6];
    int16_t y[6];
    int16_t z[6];
    uint16_t lowTimestamp[6];
}__attribute__((packed)) mps_acc_packet_t;
typedef mps_acc_packet_t accpacket_t;
Run Code Online (Sandbox Code Playgroud)

现在,在我的 Python 程序中,我想使用struct.unpack它来解压accpacket. 但是,我不知道解包的格式字符串应该是什么,因为它accpacket包含嵌套的mps_packet_header. 我尝试在开头插入格式字符串mps_packet_header,然后继续其余部分accpacket

s = struct.Struct('= B B H H 6h 6h 6h H')
seq, _type, flags, upTimestamp, x, y, z, lowTimestamp = s.unpack(packet_data)
Run Code Online (Sandbox Code Playgroud)

然而,这显然是不正确的;格式字符串的大小为calcsize44,而结构体本身的大小为 54。

如何为此结构制定正确的格式字符串?

fal*_*tru 4

  1. 您的Struct格式与 C 结构不匹配。(最后 H应该是6H
  2. struct.unpack( 6h, ..) 确实返回 6 个字段。(不是 6 个元素的)

所以你的代码应该看起来像..

s = struct.Struct('= B B H H 6h 6h 6h 6H')
fields = s.unpack(packet_data)
seq, _type, flags, upTimestamp = fields[:4]
x = fields[4:10]
y = fields[10:16]
z = fields[16:22]
lowTimestamp = fields[22:]
Run Code Online (Sandbox Code Playgroud)