在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 相关文章推荐
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
Apr 16 Python
python使用wmi模块获取windows下硬盘信息的方法
May 15 Python
Python数据类型详解(二)列表
May 08 Python
Python3安装Pymongo详细步骤
May 26 Python
Pandas:DataFrame对象的基础操作方法
Jun 07 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
python使用turtle绘制国际象棋棋盘
May 23 Python
python操作excel让工作自动化
Aug 09 Python
Python动态强类型解释型语言原理解析
Mar 25 Python
python在一个范围内取随机数的简单实例
Aug 16 Python
Python用access判断文件是否被占用的实例方法
Dec 17 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
Yii获取当前url和域名的方法
2015/06/08 PHP
PHP添加图片水印、压缩、剪切的封装类
2015/08/17 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
学习YUI.Ext第五日--做拖放Darg&Drop
2007/03/10 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
js实现页面打印功能实例代码(附去页眉页脚功能代码)
2009/12/15 Javascript
javascript 仿QQ滑动菜单效果代码
2010/09/03 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
基于JavaScript实现生成名片、链接等二维码
2015/09/20 Javascript
Angular 常用指令实例总结整理
2016/12/13 Javascript
AngularJS使用带属性值的ng-app指令实现自定义模块自动加载的方法
2017/01/04 Javascript
HTML5实现微信拍摄上传照片功能
2017/04/21 Javascript
vue iView 上传组件之手动上传功能
2018/03/16 Javascript
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
详解Vue 匿名、具名和作用域插槽的使用方法
2019/04/22 Javascript
JavaScript命名空间模式实例详解
2019/06/20 Javascript
Python动态导入模块的方法实例分析
2018/06/28 Python
Python常用的json标准库
2019/02/19 Python
python实现按行分割文件
2019/07/22 Python
Django 重写用户模型的实现
2019/07/29 Python
python基于pdfminer库提取pdf文字代码实例
2019/08/15 Python
Pytorch根据layers的name冻结训练方式
2020/01/06 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
JavaScript+Canvas实现自定义画板的示例代码
2019/05/13 HTML / CSS
计算机系毕业生推荐信
2013/11/06 职场文书
人事主管岗位职责
2014/01/30 职场文书
庆国庆活动总结
2014/08/28 职场文书
涉及车辆房产分割的离婚协议书范文
2014/10/12 职场文书
作弊检讨书范文
2015/05/06 职场文书
如何理解及使用Python闭包
2021/06/01 Python
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android