在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实现的生成自我描述脚本分享(很有意思的程序)
Jul 18 Python
速记Python布尔值
Nov 09 Python
Python深度优先算法生成迷宫
Jan 22 Python
Python实现的求解最小公倍数算法示例
May 03 Python
Python实现的爬取网易动态评论操作示例
Jun 06 Python
Python 获取numpy.array索引值的实例
Dec 06 Python
从pandas一个单元格的字符串中提取字符串方式
Dec 17 Python
已安装tensorflow-gpu,但keras无法使用GPU加速的解决
Feb 07 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
利用scikitlearn画ROC曲线实例
Jul 02 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 Python
详解numpy1.19.4与python3.9版本冲突解决
Dec 15 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实现get,post和cookie(实例介绍)
2013/06/17 PHP
PHP实现取得HTTP请求的原文
2014/08/18 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
js写的评论分页(还不错)
2013/12/23 Javascript
Javascript基础知识(三)BOM,DOM总结
2014/09/29 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
JavaScript中判断数据类型的方法总结
2016/05/24 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
Vuejs开发环境搭建及热更新【推荐】
2018/09/07 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
vue treeselect获取当前选中项的label实例
2020/08/31 Javascript
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
Python Flask-web表单使用详解
2017/11/18 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
Python assert语句的简单使用示例
2019/07/28 Python
自我鉴定模板
2013/10/29 职场文书
土木工程应届生求职信
2013/10/31 职场文书
新闻系毕业生推荐信
2013/11/16 职场文书
十八届三中全会感言
2014/03/10 职场文书
诉讼代理人授权委托书
2014/04/08 职场文书
助理政工师申报材料
2014/06/03 职场文书