zoukankan      html  css  js  c++  java
  • 字节序列化

    大家都知道,在进行网络传输的时候,因为分布在网络上的每台机器可能大小端的不同,需要进行字节序列转换,比如用win32 API的socket里面就有类似与htonl等与此类似的函数,它就是把主机端的字节序列转换成网络传输的字节序列。当然也有与之相反的函数ntohl,是把网络字节序,转换为主机字节序。

    比如 int data = 0x32461256在小端机器上按照“高高低低”的原则,内存上是这样表示,0x56,0x12,0x46,0x32。进行htonl转换后,在内存中的布局就会变成0x32,0x46,0x12,0x56。

    所以,我们通过socket的send发送结构体或者对象的时候要注意了,需要序列化,当然,大家可以说,这样一个结构体那么多字段都要手动用htonl之类的函数序列化,那么太麻烦,其实网络上有专门的序列化库,比如google的protobuff,boost也有相应模块,Qt的QDataStream内部就实现了序列化,序列化实际上就是把大小端,还有结构体字节对齐等细节屏蔽了。所以,一般通过send发送结构体不能直接把它转换成char*的字节序列发送,在发送之前,要先做序列化

    以下给出用Qt的QDataStream做序列化例子:

    http://www.java2s.com/Code/Cpp/Qt/SerializationwithQDataStream.htm

    http://comments.gmane.org/gmane.comp.lib.qt.general/38559

     注意:char型的数据是不用序列化的,因为只是单个字节,不是多字节占用

    references:

    http://stackoverflow.com/questions/5894622/sending-any-structure-via-qtcpsocket

    http://stackoverflow.com/questions/2473300/overloading-the-qdatastream-and-operators-for-a-user-defined-type

    http://stackoverflow.com/questions/1577161/passing-a-structure-through-sockets-in-c

    http://stackoverflow.com/questions/17817280/send-struct-over-socket-in-c

  • 相关阅读:
    【探路者】团队Alpha周贡献分数分配结果
    2017秋-软件工程第七次作业-第八周例行总结
    2017秋-软件工程第七次作业(2)-【探路者】Alpha周(2017年10月19)贡献分配规则和分配结果
    2017秋-软件工程第七次作业(1)-【探路者】贪吃蛇阿尔法发布展示(视频展示)
    2017秋-软件工程第七次作业(1)-【探路者】贪吃蛇阿尔法发布
    名词1
    Jsp1
    代码,python1
    关于键盘
    代码,java_web
  • 原文地址:https://www.cnblogs.com/foohack/p/4718320.html
Copyright © 2011-2022 走看看