当前位置:  开发笔记 > 编程语言 > 正文

将字节数组反序列化为结构

如何解决《将字节数组反序列化为结构》经验,为你挑选了2个好方法。

我通过网络传输了一个字符/字节数组.它包含标题和一些数据.我想将标题映射到结构上.这是一个例子:

#pragma pack(1)

struct Header
{
    unsigned short bodyLength;
    int msgID;
    unsigned short someOtherValue;
    unsigned short protocolVersion;
};

int main()
{
    boost::array msgBuffer;
    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数组,其中所有值都是相互跟随的.



1> Anonymous..:

某些处理器要求某些类型正确对齐.他们不接受指定的包装并生成硬件陷阱.

即使在常见的x86压缩结构上也会导致代码运行得更慢.

在使用不同的字节顺序平台时,您还必须小心.

顺便说一下,如果你想要一个简单的,独立于平台的通信机制,绑定到许多编程语言,那么看看YAMI.



2> unwind..:

只是简单的复制很可能会破坏,至少如果数据可能来自不同的架构(甚至只是编译器)而不是你的.这是出于以下原因:

字节序

结构包装

第二个链接是GCC特定的,但这适用于所有编译器.

我建议逐字节读取字段,并从这些字节组装更大的字段(整数等).这使您可以控制字节顺序和填充.

推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有