字节序列化

大家都知道,在进行网络传输的时候,因为分布在网络上的每台机器可能大小端的不同,需要进行字节序列转换,比如用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

 

posted @ 2015-08-10 16:12  foo__hack  阅读(1513)  评论(0编辑  收藏  举报