作为学习大学内容的一种方式,我决定开始使用UDP和新的线程内存模型在c ++ 11中编写网络库。这是我目前最大的障碍。
字节的大小是特定于平台的。 Memcpy 根据该平台上字节的大小进行复制和写入。那么我该如何制作与平台无关的代码来将完全 N 位写入我的UDP数据包? N通常是8的倍数,但我需要确保当我处理N个字节时,无论平台如何,都会修改相同数量的位。
我认为我最接近解决方案的方法是创建一个32位的基本结构,并以8的组的形式访问它。例如
struct Data
{
char a : 8;
char b : 8;
char c : 8;
char d : 8;
}
这样,我知道每个char将限制为8个字节。我的消息都是32的倍数 - 这没问题(这个结构在处理字节序时实际上会有帮助)。但是,我怎么能确定编译器不会将结构填充到平台的原生边界?这有用吗?
答案 0 :(得分:1)
您的数据结构不足。 char
类型被编译器定义为signed char
(7个数据位,1个符号位),unsigned char
(8个数据位)或char
。
发送数据包的大多数计算机使用unsigned char
或uint8_t
作为八位字节。
另外,请注意多字节排序,称为Endianness。 Big endian是最重要的字节首先出现的地方;小端是最不重要的字节首先出现的地方。
许多消息传递方案将使用零填充剩余的位,使它们达到8位,16位或32位。
答案 1 :(得分:1)
您可能正在寻找#pragma pack(nopack)
指令。正如有人指出的那样,你仍然会处理8位的倍数。
char应该总是正好1个字节,AFAIK虽然我可能错了。