我通过网络传输了一个字符/字节数组.它包含标题和一些数据.我想将标题映射到结构上.这是一个例子:
#pragma pack(1) struct Header { unsigned short bodyLength; int msgID; unsigned short someOtherValue; unsigned short protocolVersion; }; int main() { boost::arraymsgBuffer; Header header; for(int x = 0; x < sizeof(Header); x++) msgBuffer[x] = 0x01; // assign some values memcpy(&header, msgBuffer.data(), sizeof(Header)); system("PAUSE"); return 0; }
假设结构永远不包含任何可变长度字段,这总是有效吗?是否有平台独立/惯用的方式来做到这一点?
注意:
我在互联网上看到了很多允许你序列化/反序列化的库,但我得到的印象是,如果以前用同一个库序列化它们,它们只能反序列化.好吧,我无法控制传输的格式.我肯定会得到一个byte/char数组,其中所有值都是相互跟随的.
某些处理器要求某些类型正确对齐.他们不接受指定的包装并生成硬件陷阱.
即使在常见的x86压缩结构上也会导致代码运行得更慢.
在使用不同的字节顺序平台时,您还必须小心.
顺便说一下,如果你想要一个简单的,独立于平台的通信机制,绑定到许多编程语言,那么看看YAMI.
只是简单的复制很可能会破坏,至少如果数据可能来自不同的架构(甚至只是编译器)而不是你的.这是出于以下原因:
字节序
结构包装
第二个链接是GCC特定的,但这适用于所有编译器.
我建议逐字节读取字段,并从这些字节组装更大的字段(整数等).这使您可以控制字节顺序和填充.