Como usar estrutura com tamanho de dados que muda dinamicamente?
Pergunta apenas para C, C ++ e vetores não resolvem o problem
Eu tenho essa estrutura:
typedef __packed struct Packet_s
{
U8 head;
U16 len;
U32 id;
U8 data;
U8 end;
U16 crc;
} Packet_t, *Packet_p;
(EDITA: U8 é uint8_t (caractere não assinado) e assim por diante)
Por exemplo, recebi pacote (hex):
24 0B 00 07 00 00 00 AA 0D 16 1C
Ond
head = 0x24
len = 0x0B 0x00
id = 0x07 0x00 0x00 0x00
data = 0xAA
end = 0x0D
crc = 0x16 0x1C
Eu posso copiá-lo do buffer de entrada como este
U8 Buffer[SIZE]; // receives all bytes here
memcpy(&Packet, &Buffer, buffer_len);
e trabalhar mais com el
possível usar minha estrutura se o campo "DATA" for maior que 1 byt
Como posso lidar com algo assim?
24 0F 00 07 00 00 00 AA BB CC DD EE 0D BD 66
comprimento do pacote será sempre conhecido (2 e 3 bytes têm informações sobre o comprimento
EDITAR Em "manipular", quero dizer que quero fazer a seguir:
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
}
}
E também (se possível ofc) eu gostaria de enviar "respostas" usando a mesma estrutura:
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
}
Primeiro problema - não consigo obter o tamanho de toda a estrutura automaticamente, pois o ponteiro será sempre de 4 bytes ... Segundo problema - tenho certeza de que vou perder dados rsp, pois não sei onde é o final del