gpt4 book ai didi

c - 如何解析接收到的可变长度数据

转载 作者:行者123 更新时间:2023-11-30 21:39:49 26 4
gpt4 key购买 nike

假设我正在接收一个具有可变长度数据负载的数据包。

**byte_num**    **size**     **type**
0 1 Length
1 1 SrcArsDev
2 4 Src_ID
6 1 DstArsDev
7 4 Dst_ID
11 4 Session
15 1 CMD
16 N N bytes payload N<=96
16+N 2 CRC

数据将通过 SPI 通信接收。解析数据包以便我以后可以操作不同元素的一般方法是什么?

您能给我展示一个填充结构元素的简单函数/例程吗?

最佳答案

一种方法是定义一个打包结构来表示最大可能的数据包大小:

#pragma pack(push,1) // make sure everything is packed to byte level
typedef struct {
uint8_t Length;
uint8_t SrcArsDev;
uint32_t Src_ID;
uint8_t DstArsDev;
uint32_t Dst_ID;
uint32_t Session;
uint8_t CMD;
uint8_t payload[96 + 2]; // payload + CRC
} Message;
#pragma pack(pop) // restore struct packing

然后,您的读取例程直接读取这样的结构,然后消息的所有元素随后都可以作为结构中的字段进行访问。

唯一棘手的部分是,您需要根据 Length 计算出实际 CRC 字节的位置,然后从 payload[] 缓冲区中提取这些字节,但这并不太难:

Message msg;

ssize_t n = read(fd, &msg, sizeof(msg)); // read data into `msg`

uint16_t crc = *(int16_t*)&msg.payload[msg.Length]; // extract CRC

// validate CRC + perhaps also verify that n is consistent with msg.Length

// then access elements as needed:

src_id = msg.Src_ID;
dst_id = msg.Dst_ID;

关于c - 如何解析接收到的可变长度数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28321608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com