Преобразовать структуру в байты - PullRequest
8 голосов
/ 22 апреля 2010

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

Ответы [ 6 ]

13 голосов
/ 22 апреля 2010

Вы можете использовать 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; на практике это не имеет значения - оба должны давать один и тот же результат)

6 голосов
/ 22 апреля 2010
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;
3 голосов
/ 22 апреля 2010
(char*)&someStruct
2 голосов
/ 22 апреля 2010

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

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

MyStruct s;
char [] buffer = new char[sizeof(s)];
memcpy(&buffer, &s, sizeof(s));
1 голос
/ 22 апреля 2010

Я бы посмотрел на void*.

struct gizmo 
{
//w/e
};

//stuff

gizmo *G = new gizmo;

void* bytearray = (void*)G;

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

0 голосов
/ 22 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...