这是我之前的问题“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_dms_packet_t
- 区分它们的唯一方法是读取两种数据包类型都具有的type
字段。mps_packet_header
这意味着我需要在知道它的全部内容之前解包数据包,我不知道如何干净地做,因为(如果我没记错的话)两种数据包类型不同calcsize
(分别为 54 和 56)。第二个挑战是打开包装mps_dms_packet_t
;从结构的定义中可以看出,这个包有一个由 8 个实例组成的数组,而这个数组acam_hb_data_set
又是一个由两个int16
值组成的结构。我不知道如何为此制定正确的格式字符串。
我之前的代码(之前mps_dms_packet_t
介绍过)看起来像这样,正如falsetru 在他对我之前的问题的回答中所建议的那样:
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:]
这工作得很好。现在,我需要能够以某种方式读取标头(为此我需要解压缩结构),然后根据其类型正确解压缩结构。
我该怎么做呢?