在 Python 中解压嵌套的 C 结构

2024-04-14

我正在尝试解压一个 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;

现在,在我的 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)

然而,这显然是不正确的;格式字符串有一个calcsize为 44,而结构本身的大小为 54。

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


  1. You Struct格式与 C 结构不匹配。 (最终的H应该6H)
  2. 结构体.解压(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:]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Python 中解压嵌套的 C 结构 的相关文章

随机推荐