将结构转换为char数组

时间:2014-04-26 05:49:49

标签: c++ c arrays struct

我正在尝试转换由以下内容组成的结构:

struct myData
{
    double value1;
    int32_t value2;
    bool flag;
    int32_t value3;
    int32_t value4;
    bool flagArray[32];
}

我想将此结构转换为unsigned char数组,以便我可以从开源(http://www.netrino.com/code/crc.zip)应用CRC。但是我注意到bool var将被自动类型转换为4字节的var(其中3个字节是未定义的)。因此,如果CRC校验和的接收和解释与发送者不同,则CRC校验和可能会失败。

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

由于

1 个答案:

答案 0 :(得分:2)

好的,你有几个问题。

首先,从您提出问题的方式来看,您似乎正在尝试通过网络连接发送C结构。这是一个非常糟糕的主意,因为C结构的确切内存布局取决于系统,处理器类型,编译器,编译器标志等。例如,一个处理器可能是32位,另一个是64位。一个可能很大-endian,另一个小端。这会导致结构不匹配。

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

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

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