在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 greenlet实现原理和使用示例
Sep 24 Python
Python中optparse模块使用浅析
Jan 01 Python
Python中函数的参数定义和可变参数用法实例分析
Jun 04 Python
python 同时运行多个程序的实例
Jan 07 Python
Python向excel中写入数据的方法
May 05 Python
详解python中的线程与线程池
May 10 Python
Python中的四种交换数值的方法解析
Nov 18 Python
Python文本处理简单易懂方法解析
Dec 19 Python
Pytorch中实现只导入部分模型参数的方式
Jan 02 Python
忆童年!用Python实现愤怒的小鸟游戏
Jun 07 Python
python实现剪贴板的操作
Jul 01 Python
Python 图片添加美颜效果
Apr 28 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
模拟OICQ的实现思路和核心程序(二)
2006/10/09 PHP
php实现的zip文件内容比较类
2014/09/24 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
PHP单链表的实现代码
2016/07/05 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
php新建文件的方法实例
2019/09/26 PHP
yii框架数据库关联查询操作示例
2019/10/14 PHP
IE6、IE7中获取Button元素的值的bug说明
2011/08/28 Javascript
判断及设置浏览器全屏模式
2014/04/20 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
Bootstrap 下拉多选框插件Bootstrap Multiselect
2017/01/22 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
mpvue写一个CPASS小程序的示例
2018/09/04 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
2020/02/07 Javascript
解决vue-router 切换tab标签关闭时缓存问题
2020/07/22 Javascript
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
python实现中文分词FMM算法实例
2015/07/10 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
Django实现支付宝付款和微信支付的示例代码
2018/07/25 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
2019/01/23 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
Python实现查找数据库最接近的数据
2020/06/08 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
canvas绘制文本内容自动换行的实现代码
2019/01/14 HTML / CSS
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
学校党员对照检查材料
2014/08/28 职场文书
护士长2015年终工作总结
2015/04/24 职场文书
指导教师推荐意见
2015/06/05 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
关于EntityWrapper的in用法
2022/03/22 Java/Android
vue实现登陆页面开发实践
2022/05/30 Vue.js