在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两种遍历字典(dict)的方法比较
May 29 Python
Python实现把数字转换成中文
Jun 29 Python
Python编程中的异常处理教程
Aug 21 Python
python实现简单购物商城
May 21 Python
分享一个简单的python读写文件脚本
Nov 25 Python
让代码变得更易维护的7个Python库
Oct 09 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 Python
如何基于windows实现python定时爬虫
May 01 Python
Python中有几个关键字
Jun 04 Python
python unichr函数知识点总结
Dec 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
让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
2011/08/08 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
PHP和MYSQL实现分页导航思路详解
2017/04/11 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
javascript实现unicode和字符的互相转换
2007/07/18 Javascript
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
举例说明如何为JavaScript的方法参数设置默认值
2015/11/17 Javascript
JS高级运动实例分析
2016/12/20 Javascript
javascript 数据存储的常用函数总结
2017/06/01 Javascript
angularjs中判断ng-repeat是否迭代完的实例
2018/09/12 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
微信小程序用户盒子、宫格列表的实现
2020/07/01 Javascript
[03:27]《辉夜杯》线下训练营 导师CU和海涛指点迷津
2015/10/23 DOTA
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
[01:09:13]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第三场 1月19日
2021/03/11 DOTA
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
在Python中操作文件之read()方法的使用教程
2015/05/24 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
2018/09/17 Python
pycham查看程序执行的时间方法
2018/11/29 Python
对Python模块导入时全局变量__all__的作用详解
2019/01/11 Python
Python发展简史 Python来历
2019/05/14 Python
Python 实现try重新执行
2019/12/21 Python
Python入门基础之数字字符串与列表
2021/02/01 Python
市场营销专业大学生职业生涯规划文
2014/03/06 职场文书
股东合作协议书范本
2014/04/14 职场文书
关于中国梦的演讲稿
2014/04/23 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
排查并解决Oracle sysaux表空间异常增长
2022/04/20 Oracle