我正在尝试转换由以下内容组成的结构:
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校验和可能会失败。
我可以知道有什么方法可以解决这个问题吗?
由于
答案 0 :(得分:2)
好的,你有几个问题。
首先,从您提出问题的方式来看,您似乎正在尝试通过网络连接发送C结构。这是一个非常糟糕的主意,因为C结构的确切内存布局取决于系统,处理器类型,编译器,编译器标志等。例如,一个处理器可能是32位,另一个是64位。一个可能很大-endian,另一个小端。这会导致结构不匹配。
你在bool之后看到三个额外字节的原因是因为你正在处理8位bool类型而处理器是32位。在32位架构上,大多数编译器将在32位边界上对齐结构。这会在您看到的结构中留下三个未使用字节的“空间”。
有些编译器提供强制打包结构的选项..在gcc上它是#pragma pack。 这将消除您的额外空间。但它并没有解决你的endian-ness问题。为此,您需要使用函数htonl / ntohl,htons / ntohs等。
在编译器文档中查找这些和#pragma pack的手册页。