Преобразовать структуру в байты

Как бы вы преобразовали любую структуру в байтовый массив на процессорах с прямым порядком байтов?

6 ответов

Решение

Вы можете использовать char* чтобы получить доступ к любому типу объекта в C++, поэтому:

struct S
{
    int a;
    int b;
    // etc.
};

S my_s;

char* my_s_bytes = reinterpret_cast<char*>(&my_s);

// or, if you prefer static_cast:
char* my_s_bytes = static_cast<char*>(static_cast<void*>(&my_s));

(Есть по крайней мере некоторые споры о правильности reinterpret_cast против static_cast; на практике это не имеет большого значения - оба должны давать одинаковый результат)

(char*)&someStruct
I like to use a union.

typedef struct b {
  unsigned int x;
  unsigned int y;
} b_s;

typedef union a {
  b_s my_struct;
  char ary[sizeof(b_s)];
} a_u;

Что ты пытаешься сделать? Если вы пытаетесь сериализовать структуру, чтобы сохранить ее в файл или передать в сообщении, лучше использовать инструмент, разработанный для этого, например, boost:: serialization.

Если вы просто хотите массив байтов, вы могли бы reinterpret_cast<char*> как уже упоминали другие, или делайте:

MyStruct s;
char [] buffer = new char[sizeof(s)];
memcpy(&buffer, &s, sizeof(s));

Я бы заглянул в void*,

struct gizmo 
{
//w/e
};

//stuff

gizmo *G = new gizmo;

void* bytearray = (void*)G;

То, как ваша структура упаковывается, неоднозначно и зависит от компилятора, ABI и CPU. Вы должны выяснить это из своих руководств и некоторых сборочных материалов.

Проблема со всеми этими ответами состоит в том, что вы действительно не можете выполнить замену байтов без знания чего-либо о данных, которые вы меняете. Символьные данные не меняются местами. Для 64-битных целых чисел требуется разная замена в зависимости от того, как именно эти процессоры их реализовали.

Другие вопросы по тегам