将struct转换为字节

时间:2010-04-22 15:55:00

标签: c++

如何在具有little-endian的处理器上将任何结构转换为字节数组?

6 个答案:

答案 0 :(得分:13)

您可以使用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));

(至少some debate超过reinterpret_caststatic_cast的正确性;在实践中它并不重要 - 两者都应该产生相同的结果)< / p>

答案 1 :(得分:6)

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;

答案 2 :(得分:3)

(char*)&someStruct

答案 3 :(得分:2)

你想做什么?如果您正在尝试序列化结构,以便将其保存到文件中或将其传递给消息,那么最好使用专为boost::serialization设计的工具。

如果您只想要一个字节数组,您可以像其他人提到的那样reinterpret_cast<char*>,或者这样做:

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

答案 4 :(得分:1)

我会查看void*

struct gizmo 
{
//w/e
};

//stuff

gizmo *G = new gizmo;

void* bytearray = (void*)G;

你的struct如何打包是不明确的,取决于编译器,ABI和CPU。你必须从你的手册中找到答案。一些集会阅读。

答案 5 :(得分:0)

所有这些答案的问题在于,在不了解您正在交换的数据的情况下,您无法真正进行哑字节交换。字符数据交换。 64位整数需要进行不同类型的交换,具体取决于所讨论的两个处理器如何实现它们。