Я работаю над сетевым программированием. Я получаю пакеты через сокет. Формат пакета: HEADER + MESSAGE'1 + Message'2 + ... + Message'n введите описание изображения здесь
заголовок имеет 16 байтов. части заголовка, имеющие много элементов данных, одной из которых является общее количество сообщений
( msgCount : - описать общее количество сообщений в пакете).
Не существует разделителей между заголовком пакета и сообщениями или между самими сообщениями. Для определения начала каждого сообщения необходимо использовать размер заголовка и каждого отдельного сообщения.
Формат каждого сообщения в пакете зависит от типа сообщения. Однако независимо от типа сообщения все сообщения начинаются с двухбайтового размера сообщения, за которым следует двухбайтовый тип сообщения.
MsgSize Двоичное целое число, представляющее длину сообщения ( включая заголовок)
MsgType Двоичное целое число, представляющее тип сообщения.
Я хочу проанализировать все сообщения и отобразить их в соответствующие структуры (структуры) в соответствии с там msgType.
using namespace std;
struct Header
{
short seqNum;
short msgCount;
long msgTime;
//there are other data members also
};
struct FindMessage
{
short msgType;
short msgSize;
};
struct Message1 : public FindMessage
{
//data members.....
};
struct Message2 : public FindMessage
{
//data members.....
};
void processPacket(char* packet)
{
char *msgFront=NULL;
char charMessgae;
int size = sizeof(packet);
int readDone = 16;
Header hdr; //struct
memcpy(&hdr, packet,16); // size of header is 16 byte
int msgCount = hdr.msgCount;
for (int i =0; i < msgCount; i++)
{
FindMessage *newMessage; // struct
packet = packet + 15; // moving pointer to the end of header part
for (int j = 1; j <= 4; j++)
{
msgFront = msgFront+packet[15 + j];
}
newMessage = (FindMessage*)msgFront; // taking first 4 byte of remaing Packet which containg msgsize and msgType;
for (int k = readDone; k < newMessage->msgSize; k++)
{
charMessgae = charMessgae + packet[k];
}
switch (newMessage->msgType)
{
case 1:
Message1 *msg = (Message1*)charMessgae;
//using Message1 struct members...
break;
case 2:
Message2 *msg = (Message2*)charMessgae;
//using Message1 struct members...
break;
}
readDone += newMessage->msgSize;
memset(&charMessgae,0,sizeof(charMessgae));
memset(newMessage, 0, sizeof(newMessage)); // setting memory to zero to assigne new value;
}
}
в основном я хочу сделать нарезку байтового массива разного размера и затем сопоставить их с различными структурами.