Как хранить данные нескольких типов в указателе - PullRequest
0 голосов
/ 28 октября 2019

Я пытаюсь проанализировать буфер, состоящий из множества типов данных.

Для примера буфера:

void* buffer = "1111aaaa[another similar buffer][a second similar buffer]1111"
// Buffer is not actually a string, it is just to show (these are bytes that correspond different types).

У меня есть информация о том, как проанализировать этот файл до сих порЯ делал memcpy для извлечения этих значений, таких как:

memcpy(some_int, buffer, 4);
buffer += 4;
memcpy(some_char_array, buffer, 4);
buffer += 4;
// etc...
// So I am trying to parse the buffer like using a file pointer.

Пока это работает для меня, но у меня было нерегулярное поведение (может быть, просто какая-то другая ошибка, она работаладо сих пор нормально).

Поэтому я провел некоторое исследование, что арифметика указателей в c опрометчива (хотя GCC в некоторой степени это позволяет). Так как же мне хранить и анализировать эти данные в c?

Некоторые вопросы здесь о SO показали, что вы можете привести их к указателю на символ непосредственно перед увеличением указателя (на определенное количество байтов), но выиграли 't, которые дают неявное предупреждение о преобразовании и увеличивают сложность кода?

Разве нельзя разрешить увеличивать указатель void, если разработчик точно знает, сколько байтов он / она хочет продвинуть?

Если нет, как я могу сделать это в других методах C?

Edit1: Если хранение данных в char* не сделает ничего, кроме помощи мнеувеличить указатель, могу ли я просто хранить все данные в char* и memcpy оттуда?

1 Ответ

0 голосов
/ 28 октября 2019

Если длины ваших элементов данных известны и всегда одинаковы, вы можете настроить структуру и привести весь буфер к этой структуре.

Пример:

typedef struct {
    int32_t some_integer;
    char some_char_array[4];
    ... (some_other_member);
} my_data_t;

my_data_t *data = (my_data_t *)buffer;

Затем вы можете получить доступ к полям данных, используя data->some_integer, data->some_char_array и т. Д., Что, на мой взгляд, более понятно и более понятно, чем перемещение указателя через буфер.

...