Преобразовать структуру в байты
Как бы вы преобразовали любую структуру в байтовый массив на процессорах с прямым порядком байтов?
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
; на практике это не имеет большого значения - оба должны давать одинаковый результат)
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-битных целых чисел требуется разная замена в зависимости от того, как именно эти процессоры их реализовали.