为了了解我的大学内容,我决定开始使用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;
}这样,我知道每个字符将被限制为8个字节。我的消息都是32的倍数-这没问题(这个结构在处理endianness时实际上会有所帮助)。但是,如何确保编译器不会将结构放置到平台的本机边界?这个能行吗?
发布于 2014-03-05 00:19:47
您的数据结构不够。编译器将char类型定义为signed char (7个数据位、1个符号位)、unsigned char (8个数据位)或char。
大多数发送数据包的计算机对八进制使用unsigned char或uint8_t。
此外,要注意多字节排序,即Endianness。大端字节是最重要的字节的第一位,而最小的字节是第一位的。
许多消息传递方案会用零填充剩余位,使其达到8位、16位或32位。
发布于 2014-03-05 00:28:40
您可能正在寻找#pragma pack(nopack)指令。然而,正如有人指出的,你仍然要处理8位的倍数。
char应该始终是1字节,AFAIK,虽然我可能错了。
https://stackoverflow.com/questions/22184651
复制相似问题