如何在具有little-endian的处理器上将任何结构转换为字节数组?
答案 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_cast
与static_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位整数需要进行不同类型的交换,具体取决于所讨论的两个处理器如何实现它们。