Разрезание байтового массива и отображение частей на структуры - PullRequest
0 голосов
/ 17 марта 2020

Я работаю над сетевым программированием. Я получаю пакеты через сокет. Формат пакета: 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;

    }
}

в основном я хочу сделать нарезку байтового массива разного размера и затем сопоставить их с различными структурами.

...