用Python解包复杂的嵌套C结构

2024-06-16 09:58:56 发布

您现在位置:Python中文网/ 问答频道 /正文

这是my previous question, "Unpacking nested C structs in 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 lowTimestmp[6];
}__attribute__ ((packed)) mps_acc_packet_t;
typedef mps_acc_packet_t accpacket_t;

typedef struct {
    int16_t hb1;
    int16_t hb2;
} acam_hb_data_set;

typedef struct __attribute__ ((packed)) {
    mps_packet_header header;
    uint16_t temp;
    uint16_t lowTimestmp[8];
    acam_hb_data_set dms_data[8];
} mps_dms_packet_t;

由此产生了两个挑战。首先,我接收到的包(以二进制形式)可以是mps_acc_packet_t或{}-区分它们的唯一方法是读取mps_packet_header中的type字段,这两种包类型都有。这意味着我需要在知道包的全部内容之前解包,但我不知道如何干净地进行操作,因为(如果我没弄错的话)这两种数据包类型有不同的calcsize(分别为54和56)。第二个挑战是解包mps_dms_packet_t;正如您从结构的定义中看到的,这个包有一个由acam_hb_data_set的8个实例组成的数组,而这个数组又是一个由两个int16值组成的结构。我不知道如何为它构造一个正确的格式字符串。在

我以前的代码(在引入mps_dms_packet_t之前)如下所示,如falsetru in his answer to my previous question所示:

^{pr2}$

这很有效。现在,我需要以某种方式读取头(我需要为其解压结构),然后根据结构的类型正确地解压该结构。在

我该怎么做呢?在


Tags: datapacketdmsattribute结构mpsstructheader
1条回答
网友
1楼 · 发布于 2024-06-16 09:58:56

为什么不试试ctypes?它更易读,更容易打包/解包数据。在

import ctypes
class mps_packet_header(ctypes.Structure):
        _fields_ = [
        ("seq", ctypes.c_uint8),
        ("type", ctypes.c_uint8),
        ("flags", ctypes.c_uint16),
        ("upTimestamp", ctypes.c_uint16)
    ]

class mps_acc_packet_t(ctypes.Structure):
    _fields_ = [
        ("header", mps_packet_header),
        ("x", ctypes.c_int16 * 6),
        ("y", ctypes.c_int16 * 6),
        ("z", ctypes.c_int16 * 6),
        ("lowTimestmp", ctypes.c_uint16 * 6)
    ]


class acam_hb_data_set(ctypes.Structure):
    _fields_ = [
        ("hb1", ctypes.c_int16),
        ("hb2", ctypes.c_int16),
    ]


class mps_dms_packet_t(ctypes.Structure):
    _fields_ = [
        ("header", mps_packet_header),
        ("temp", ctypes.c_uint16),
        ("lowTimestmp", ctypes.c_uint16 * 8),
        ("dms_data", acam_hb_data_set * 8)
    ]

相关问题 更多 >