【发布时间】:2019-03-01 01:29:39
【问题描述】:
仅针对 C 的问题,C++ 和向量不能解决问题。
我有这样的结构:
typedef __packed struct Packet_s
{
U8 head;
U16 len;
U32 id;
U8 data;
U8 end;
U16 crc;
} Packet_t, *Packet_p;
(编辑:U8是uint8_t(无符号字符)等等)
例如,我收到了数据包(十六进制):
24 0B 00 07 00 00 00 AA 0D 16 1C
在哪里
头 = 0x24
len = 0x0B 0x00
id = 0x07 0x00 0x00 0x00
数据 = 0xAA
结束 = 0x0D
crc = 0x16 0x1C
我可以像这样从传入的缓冲区复制它
U8 Buffer[SIZE]; // receives all bytes here
memcpy(&Packet, &Buffer, buffer_len);
并继续努力。
如果字段“DATA”超过 1 个字节,是否可以使用我的结构?
我该如何处理这样的事情?
24 0F 00 07 00 00 00 AA BB CC DD EE 0D BD 66
数据包的长度总是已知的(2 和 3 个字节有长度信息)。
编辑:在“句柄”下我的意思是我接下来要做:
if (isCRCmatch() )
{
if(Packet.id == SPECIAL_ID_1)
{
// do something
}
if(Packet.id == SPECIAL_ID_2)
{
// do other
}
if(Packet.data[0] == 0xAA)
{
// do one stuff
}
if(Packet.data[1] == 0xBB && Packet.id == SPECIAL_ID_3 )
{
// do another stuff
}
}
而且(如果可能的话)我想使用相同的结构发送“答案”:
U8 rspData[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
SendResponce(Packet.id, rspData);
void SendResponce (U8 id_rsp, uint8_t* data_rsp)
{
Packet_t ResponceData;
uint16_t crc;
uint8_t *data;
ResponceData.head = 0x24;
ResponceData.len = sizeof(ResponceData); // HERE IS PROBLEM ONE
ResponceData.id = id_rsp;
ResponceData.data = *data_rsp; // HERE IS PROBLEM TWO
ResponceData.end = 0x0D; // symbol '\r'
data = (uint8_t*)&ResponceData;
crc = GetCrc(data, sizeof(ResponceData)-2); // last 2 bytes with crc
ResponceData.crc = crc;//(ack_crc >> 8 | ack_crc);
SendData((U8*)&ResponceData, sizeof(ResponceData)); // Send rsp packet
}
第一个问题 - 我不能自动获取所有结构的大小,因为指针总是 4 字节... 第二个问题 - 我确定我会丢失 rsp 数据,因为我不知道它在哪里结束。
【问题讨论】:
-
数据永远不会超过一个字节,因为它被声明为 U8 数据;
-
U8类型是什么? -
U8 是 uint8_t(无符号字符)
-
那么我怎样才能将第二个数据示例“放置”到结构中呢?我应该用指针 U8* 数据声明新结构吗?怎么会这样包装?...
-
从通信的角度来看,显然
U8 data;在概念上是U8 data[len - 10];。作为 C 结构,中间的可变长度数组是不允许的,但我敢打赌,这是用于序列化消息的数据包。 OP 需要发布更多内容以显示“处理”目标是什么。 “我怎么能处理这样的事情?”太模糊了。
标签: c structure packet packet-capture