C++ 将结构转换为字符数组

C++ 将结构转换为字符数组,c++,c,arrays,struct,C++,C,Arrays,Struct,我正在尝试转换包含以下内容的结构: struct myData { double value1; int32_t value2; bool flag; int32_t value3; int32_t value4; bool flagArray[32]; } 我想把这个结构转换成一个无符号字符数组,这样我就可以从开源()中应用CRC。然而,我注意到bool变量将自动类型转换为一个包含4个字节(其中3个字节未定义)的变量。因此,如果CRC校验和的接

我正在尝试转换包含以下内容的结构:

struct myData
{
    double value1;
    int32_t value2;
    bool flag;
    int32_t value3;
    int32_t value4;
    bool flagArray[32];
}
我想把这个结构转换成一个无符号字符数组,这样我就可以从开源()中应用CRC。然而,我注意到bool变量将自动类型转换为一个包含4个字节(其中3个字节未定义)的变量。因此,如果CRC校验和的接收和解释与发送方不同,则CRC校验和可能会失败

我能知道有什么办法可以解决这个问题吗


谢谢

好的,你有几个问题

首先,从你回答问题的方式来看,你似乎试图通过网络连接发送一个C结构。这是一个非常糟糕的主意,因为C结构的确切内存布局取决于系统、处理器类型、编译器、编译器标志。。例如,一个处理器可以是32位,另一个是64位。一个可以是大端,另一个是小端。这将导致结构不匹配

您在bool之后看到三个额外字节的原因是,您处理的是8位bool类型,而处理器是32位的。在32位体系结构上,大多数编译器将在32位边界上对齐结构。。这会在您看到的结构中留下三个未使用字节的“空间”

有些编译器提供了强制打包结构的选项。。在gcc上是#pragma pack。 这将消除您的额外空间。但它不能解决你的endian ness问题。为此,您需要使用函数htonl/ntohl、htons/ntohs等


在编译器文档中查找这些和#pragma pack的手册页。

根据您使用的编译器,您应该有一些选项来指定如何打包结构成员,看看这里,可移植的方法是将值无损地转换为字节流(虽然处理
double
有点问题)。一种半便携的方法是用
uint32\u t flag
替换
bool flag
bool flagArray[32]
替换
char flagArray[32]
甚至
uint32\u flagArray
;使用
htonl
,并检查sizeof(struct myData)元素的大小之和。查找序列化。这是您需要的。