В C ++ есть способ «сопоставить» желаемый макет с данными в памяти, без его копирования в память?
Т.е. существует void* buffer
, и я знаю его макет :
- byte1: uint8_t
- byte2-3: uint16_t
- byte4: uint8_t
Я знаю, что могу создать структуру, и запишите данные в структуру, а затем я могу иметь значения в виде полей структуры.
Но есть ли способ добиться этого без копирования? Данные уже есть, мне просто нужно получить несколько полей, и я ищу способ что-то, что может помочь с разметкой.
(у меня может быть несколько static int
s для смещений памяти, но Я надеюсь на еще несколько общих c).
Т.е.: у меня было бы больше «макетов», и в зависимости от типа необработанных данных я бы сопоставил соответствующий макет и получил доступ к его полям, которые все еще указывает на исходные данные.
Я знаю, что могу указывать структуры на данные, это просто:
struct message {
uint8_t type;
};
struct request:message {
uint8_t rid;
uint8_t other;
};
struct response:message {
uint8_t result;
};
vector<uint8_t> data;
data.push_back(1); //type
data.push_back(10);
data.push_back(11);
data.push_back(12);
data.push_back(13);
struct request* ptrRequest;
ptrRequest = (struct request*)&data[1];
cout << (int)ptrRequest->rid; //10
cout << (int)ptrRequest->other; //11
Но я бы хотел получить карту с макетами , то есть:
map<int, struct message*> messagetypes;
Но я понятия не имею, как я могу продолжить, поскольку для установки потребуется новый объект, а кастинг также является сложной задачей, если на картах хранятся только базовые указатели.