【发布时间】:2011-02-11 03:39:21
【问题描述】:
如何在具有 little-endian 的处理器上将任何结构转换为字节数组?
【问题讨论】:
-
请根据您的要求进行扩展 - 请注意,您的答案将非常依赖于处理器架构
-
little endian 的寻址单位是什么?你真正想做什么?
标签: c++
如何在具有 little-endian 的处理器上将任何结构转换为字节数组?
【问题讨论】:
标签: c++
我喜欢使用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;
【讨论】:
ary[sizeof(b)]?
所有这些答案的问题在于,如果不了解要交换的数据,就无法真正进行哑字节交换。字符数据不会被交换。 64 位整数需要不同类型的交换,具体取决于所讨论的两个处理器如何实现它们。
【讨论】:
我会凝视void*。
struct gizmo
{
//w/e
};
//stuff
gizmo *G = new gizmo;
void* bytearray = (void*)G;
你的结构如何被打包是不明确的,取决于编译器、ABI 和 CPU。你必须从你的手册和一些汇编阅读中弄清楚。
【讨论】:
你想做什么?如果您尝试序列化结构以便将其保存到文件或在消息中传递,则最好使用专为该结构设计的工具,例如 boost::serialization。
如果您只想要一个字节数组,您可以像其他人提到的那样reinterpret_cast<char*>,或者这样做:
MyStruct s;
char [] buffer = new char[sizeof(s)];
memcpy(&buffer, &s, sizeof(s));
【讨论】:
(char*)&someStruct
【讨论】:
您可以使用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;实际上这并不重要——两者都应该产生相同的结果)
【讨论】:
char* b = (char*)&my_s; 如果我再次学习 C++,我会先阅读一些关于这些演员构造的内容。
reinterpret_cast 相同,因为static_cast 和const_cast 的组合都不有效。使用 C++ 风格的演员表可以保证你得到你想要的演员表; C 风格的演员表基本上只是尝试一系列五种不同类型的演员表,直到找到一个有效的演员表。