C++和python使用struct传输二进制数据结构来实现
网络编程问题往往涉及二进制数据的传输。在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
C++和python使用struct传输二进制数据结构来实现的更多相关文章
- Python使用struct处理二进制
有的时候需要用python处理二进制数据,比如,存取文件,socket操作时.这时候,可以使用python的struct模块来完成.可以用 struct来处理c语言中的结构体. struct模块中最重 ...
- Python使用struct处理二进制(pack和unpack用法)
转载自:http://www.cnblogs.com/gala/archive/2011/09/22/2184801.html 这篇文章写的很好,所以无耻的转了.. 有的时候需要用python处理二进 ...
- Python采用struct处理二进制
有时需要使用python二进制数据,实例,件.socket操作时.这时候.能够使用python的struct模块来完毕.能够用 struct来处理c语言中的结构体. struct模块中最重要的三个函数 ...
- struct:二进制数据结构的打包与解包
介绍 struct模块包括一些函数,这些函数可以完成字节串与原生Python数据类型(如数字和字符串)之间的转换 函数与Struct类 struct提供了一组处理结构值的模块级函数,另外还有一个Str ...
- Pytho, struct处理二进制(pack和unpack)
[转]Python使用struct处理二进制(pack和unpack用法) Leave a reply 转载自:http://www.cnblogs.com/gala/archive/2011/09/ ...
- Python3标准库:struct二进制数据结构
1. struct二进制数据结构 struct模块包括一些函数,这些函数可以完成字节串与原生Python数据类型(如数字和字符串)之间的转换. 1.1 函数与Struct类 struct提供了一组处理 ...
- python中struct模块
# #********struct模块********# # 1.按照指定格式将Python数据转换为字符串,该字符串为字节流,如网络传输时, # 不能传输int,此时先将int转化为字节流,然后再发 ...
- 【转】在Python的struct模块中进行数据格式转换的方法
这篇文章主要介绍了在Python的struct模块中进行数据格式转换的方法,文中还给出了C语言和Python语言的数据类型比较,需要的朋友可以参考下 Python是一门非常简洁的语言,对于数据类型的表 ...
- python之struct详解
python之struct详解 2018-05-23 18:20:29 醉小义 阅读数 20115更多 分类专栏: python 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ...
随机推荐
- bzoj1821: [JSOI2010]Group 部落划分 Group
kruskal算法. #include<cstdio> #include<algorithm> #include<cstring> #include<cmat ...
- [C#] 我的log4net使用手册
1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...
- MYSQL学习心得
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- EntityFramework版本下载和更新
安装指定版本的Package(例如:EntityFramework 5.0): PM> Install-Package EntityFramework -ProjectName MusicSto ...
- 高质量、处于持续更新的R包
本文在Creative Commons许可证下发布 自由软件的问题是开发人员没有稳定的资金来源支持,可能更新上做不到持续.经过考证和圈内朋友的帮助,现在把R包中高质量.持续更新的跟大数据事业相关的R包 ...
- [tensorflow in a nutshell] tensorflow简明教程 (第一部分)
原文链接: https://medium.com/@camrongodbout/tensorflow-in-a-nutshell-part-one-basics-3f4403709c9d#.31jv5 ...
- [九度OJ]1113.二叉树(求完全二叉树任意结点所在子树的结点数)
原题链接:http://ac.jobdu.com/problem.php?pid=1113 题目描述: 如上所示,由正整数1,2,3……组成了一颗特殊二叉树.我们已知这个二叉树的最后一个结点是n.现在 ...
- faplayer编译配置经验
最近在做在线m3u8类格式的视频直播应用, 在获取m3u8的文件之后,如果采用Android系统播放器来播,会有各种各样的问题,容易卡死.不连续,也不能自定义一些选项.查找资料以后,决定采用fapla ...
- Tcp服务端判断客户端是否断开连接
今天搞tcp链接弄了一天,前面创建socket,绑定,监听等主要分清自己的参数,udp还是tcp的.好不容易调通了,然后就是一个需求,当客户端主动断开连接时,服务端也要断开连接,这样一下次客户端请求链 ...
- Windows下Android SDK Manage下载速度缓慢的解决方法
在SDK Manager下Tools->Options打开了SDK Manager的Settings,选中“Force https://… sources to be fetched using ...