您的位置:首页 > 理论基础 > 数据结构算法

C++和python使用struct传输二进制数据结构来实现

2015-12-13 10:22 691 查看
网络编程问题往往涉及二进制数据的传输。在C++经常使用的传输是文本字符串和分组结构。

假设该数据可以预先送入连续的内存区域,然后让send函数来获得的第一个地址,这一块连续的内存区就能完成传输数据。文本字符串,如char排列,字节。中是顺序存储的。所以能够直接用send函数发送。

可是假设要同一时候发送多个不同类型的数据时,它们在内存中存储的地址是随机的,不是顺序存储的,并且它们之间的相对位置也无法确定。这样就须要一种数据组织方式来明白各数据之间的相对位置。结构体显然就是一种的数据组织方式,使用结构体要注意数据对齐的问题,关于结构体中数据对齐的问题可參考这篇文章:http://blog.163.com/kan586@126/blog/static/95532454200891191451827/

假设熟悉结构体中数据对齐的规则,能够合理设计结构体的结构,各成员变量的顺序,使得全部的数据成员存放在连续的存储区。并且结构体的长度等于全部成员长度之和(能够适当在尾部用字符数组补齐,避免编译器自己主动填充),这样就方便用send函数发送了。( 假设server和client都是用C/C++开发,两端能够通过相同结构的结构体来封包和解包,能够不考虑数据对齐的问题)以下讨论的是在C++和python开发的两端之间数据传输的情况:client用的C++编写,server端用python编写。相对于C++中用struct来封包和解包,python提供了struct库实现类似的功能,最重要的三个函数是pack,unpack,calcsize,struct库处理二进制数据的详细使用方法能够參考这篇文章:http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html。在python下用socket接收到的字节流实际上是字符串。须要对全部的字节进行指定解析格式,所以在C++发送的时候就要避免发送不确定的数据(如编译器自己主动填充的数据)。假设用struct组织数据就须要考虑数据对齐的问题了。

以下用一个实例来说明:在C++client有1个a(float)
,1个b(unsigned char),一个c(short) 要发送给server端,在不使用#pragma指令指定编译器的对齐位数时, 在我的编译器环境下默觉得4。能够这样设计结构体:

struct data
{
float a;                 //0~3
short c;                 //4~5
unsigned char b;         //6
char extra[2];           //7~8  结构体长度为8字节,这里用字符数组补齐8字节,避免编译器填充
};
pythonserver端用struct库来解包。能够设计例如以下格式:

import struct
...
rdata = s.recv(1024)
a,b,c,d = struct.('fhB2s',rdata)  #a,b,c即需要对数据进行
print a,b,c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: