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

questionAnswers(3)

yourAnswerToTheQuestion