在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 相关文章推荐
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
Python的Django框架中自定义模版标签的示例
Jul 20 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
python使用mysql的两种使用方式
Mar 07 Python
Python自定义函数实现求两个数最大公约数、最小公倍数示例
May 21 Python
使用Python的Django和layim实现即时通讯的方法
May 25 Python
python中类的属性和方法介绍
Nov 27 Python
Python3 log10()函数简单用法
Feb 19 Python
python异常处理、自定义异常、断言原理与用法分析
Mar 23 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
python 如何用urllib与服务端交互(发送和接收数据)
Mar 04 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 正则 过滤html 的超链接
2009/06/02 PHP
PHP读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
PHP自动重命名文件实现方法
2014/11/04 PHP
php 可变函数使用小结
2018/06/12 PHP
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
JS 遮照层实现代码
2010/03/31 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
JS图片自动轮换效果实现思路附截图
2014/04/30 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
chrome调试javascript详解
2015/10/21 Javascript
js点击按钮实现水波纹效果代码(CSS3和Canves)
2016/09/15 Javascript
关于vue-router路径计算问题
2017/05/10 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
js实现自定义滚动条的示例
2020/10/27 Javascript
[42:25]EG vs Spirit Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
python结合selenium获取XX省交通违章数据的实现思路及代码
2016/06/26 Python
Python基于tkinter模块实现的改名小工具示例
2017/07/27 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
Python调用C语言的实现
2019/07/26 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
Python批量启动多线程代码实例
2020/02/18 Python
浅析matlab中imadjust函数
2020/02/27 Python
浅谈keras中的Merge层(实现层的相加、相减、相乘实例)
2020/05/23 Python
Dr. Martens马汀博士澳大利亚官网:马丁靴鼻祖
2019/07/02 全球购物
什么是View State?
2013/01/27 面试题
住房抵押登记委托书
2014/09/27 职场文书
人民调解协议书范本
2014/10/11 职场文书
质量保证书格式模板
2015/02/27 职场文书
学雷锋活动简报
2015/07/20 职场文书
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python