在Python的struct模块中进行数据格式转换的方法


Posted in Python onJune 17, 2015

Python是一门非常简洁的语言,对于数据类型的表示,不像其他语言预定义了许多类型(如:在C#中,光整型就定义了8种),它只定义了六种基本类型:字符串,整数,浮点数,元组,列表,字典。通过这六种数据类型,我们可以完成大部分工作。但当Python需要通过网络与其他的平台进行交互的时候,必须考虑到将这些数据类型与其他平台或语言之间的类型进行互相转换问题。打个比方:C++写的客户端发送一个int型(4字节)变量的数据到Python写的服务器,Python接收到表示这个整数的4个字节数据,怎么解析成Python认识的整数呢? Python的标准模块struct就用来解决这个问题。

struct模块的内容不多,也不是太难,下面对其中最常用的方法进行介绍:
 struct.pack

struct.pack用于将Python的值根据格式符,转换为字符串(因为Python中没有字节(Byte)类型,可以把这里的字符串理解为字节流,或字节数组)。其函数原型为:struct.pack(fmt, v1, v2, …),参数fmt是格式字符串。v1, v2, …表示要转换的python值。下面的例子将两个整数转换为字符串(字节流):
 

import struct
 
a = 20
b = 400
 
str = struct.pack("ii", a, b) 
#转换后的str虽然是字符串类型,但相当于其他语言中的字节流(字节数组),可以在网络上传输
print 'length:', len(str)
print str
print repr(str)
 
#---- result
#length: 8
#  ----这里是乱码
#'/x14/x00/x00/x00/x90/x01/x00/x00'

格式符”i”表示转换为int,'ii'表示有两个int变量。进行转换后的结果长度为8个字节(int类型占用4个字节,两个int为8个字节),可以看到输出的结果是乱码,因为结果是二进制数据,所以显示为乱码。可以使用python的内置函数repr来获取可识别的字符串,其中十六进制的0×00000014, 0×00001009分别表示20和400。
struct.unpack

struct.unpack做的工作刚好与struct.pack相反,用于将字节流转换成python数据类型。它的函数原型为:struct.unpack(fmt, string),该函数返回一个元组。 下面是一个简单的例子:
 

str = struct.pack("ii", 20, 400)
a1, a2 = struct.unpack("ii", str)
print 'a1:', a1
print 'a2:', a2
 
#---- result:
#a1: 20
#a2: 400
struct.calcsize

struct.calcsize用于计算格式字符串所对应的结果的长度,如:struct.calcsize(‘ii'),返回8。因为两个int类型所占用的长度是8个字节。
struct.pack_into, struct.unpack_from

这两个函数在Python手册中有所介绍,但没有给出如何使用的例子。其实它们在实际应用中用的并不多。Google了很久,才找到一个例子,贴出来共享一下:
 

import struct
from ctypes import create_string_buffer
 
buf = create_string_buffer(12)
print repr(buf.raw)
 
struct.pack_into("iii", buf, 0, 1, 2, -1)
print repr(buf.raw)
 
print struct.unpack_from('iii', buf, 0)
 
#---- result
#'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00'
#'/x01/x00/x00/x00/x02/x00/x00/x00/xff/xff/xff/xff'
#(1, 2, -1)

关于格式字符串

在Python手册中,给出了C语言中常用类型与Python类型对应的格式符:

在Python的struct模块中进行数据格式转换的方法

具体内容请参考Python手册struct 模块

Python 相关文章推荐
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
tensorflow学习笔记之mnist的卷积神经网络实例
Apr 15 Python
python 格式化输出百分号的方法
Jan 20 Python
python实现kmp算法的实例代码
Apr 03 Python
详解pandas删除缺失数据(pd.dropna()方法)
Jun 25 Python
从pandas一个单元格的字符串中提取字符串方式
Dec 17 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 Python
python 字典item与iteritems的区别详解
Apr 25 Python
Python pandas如何向excel添加数据
May 22 Python
vscode配置anaconda3的方法步骤
Aug 08 Python
python的列表生成式,生成器和generator对象你了解吗
Mar 16 Python
Python实现的使用telnet登陆聊天室实例
Jun 17 #Python
Python使用urllib2模块实现断点续传下载的方法
Jun 17 #Python
Python合并两个字典的常用方法与效率比较
Jun 17 #Python
Python操作串口的方法
Jun 17 #Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 #Python
Django中模型Model添加JSON类型字段的方法
Jun 17 #Python
Python中map和列表推导效率比较实例分析
Jun 17 #Python
You might like
关于php curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
Yii2数据库操作常用方法小结
2017/05/04 PHP
php微信开发之谷歌测距
2018/06/14 PHP
php写入txt乱码的解决方法
2019/09/17 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
PHP抓取HTTPS内容和错误处理的方法
2016/09/30 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
原生JS+Canvas实现五子棋游戏
2020/05/28 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
跨域请求两种方法 jsonp和cors的实现
2018/11/11 Javascript
kafka调试中遇到Connection to node -1 could not be established. Broker may not be available.
2019/09/17 Javascript
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
JavaScript 如何在浏览器中使用摄像头
2020/12/02 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
[29:16]完美世界DOTA2联赛决赛日 Inki vs LBZS 第三场 11.08
2020/11/10 DOTA
Python中使用Beautiful Soup库的超详细教程
2015/04/30 Python
浅析Python编写函数装饰器
2016/03/18 Python
python进阶之自定义可迭代的类
2019/08/20 Python
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
巴西一家专门从事家居和装饰的连锁店:Camicado
2019/08/14 全球购物
运动会入场式解说词
2014/02/18 职场文书
婚礼主持结束词
2014/03/13 职场文书
职位说明书范文
2014/05/07 职场文书
医院党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
蓬莱阁导游词
2015/02/04 职场文书
档案工作个人总结
2015/03/03 职场文书
追悼会家属答谢词
2015/09/29 职场文书
教师岗位说明书
2015/09/30 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python
Python实现排序方法常见的四种
2021/07/15 Python
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS