在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 open()文件处理使用介绍
Nov 30 Python
通过C++学习Python
Jan 20 Python
python中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
Python中最常用的操作列表的几种方法归纳
Apr 24 Python
Python3访问并下载网页内容的方法
Jul 28 Python
Python pyinotify模块实现对文档的实时监控功能方法
Oct 13 Python
对python插入数据库和生成插入sql的示例讲解
Nov 14 Python
在macOS上搭建python环境的实现方法
Aug 13 Python
Django 自定义分页器的实现代码
Nov 24 Python
python线程定时器Timer实现原理解析
Nov 30 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
May 22 Python
pycharm 如何查看某一函数源码的快捷键
May 12 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中使用匿名函数操作数据库的例子
2014/11/17 PHP
基于PHP实现用户注册登录功能
2016/10/14 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
浏览器打开层自动缓慢展开收缩实例代码
2013/07/04 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
jQuery 删除或是清空某个HTML元素示例
2014/08/04 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
javascript编写贪吃蛇游戏
2015/07/07 Javascript
jquery捕捉回车键及获取checkbox值与异步请求的方法
2015/12/24 Javascript
form表单转Json提交的方法(推荐)
2016/09/23 Javascript
Angular排序实例详解
2017/06/28 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
JavaScript 中的执行上下文和执行栈实例讲解
2021/02/25 Javascript
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
python动态性强类型用法实例
2015/05/09 Python
深入理解Python中装饰器的用法
2016/06/28 Python
python实现下载整个ftp目录的方法
2017/01/17 Python
python通过elixir包操作mysql数据库实例代码
2018/01/31 Python
Python基于SMTP协议实现发送邮件功能详解
2018/08/14 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
python按照多个条件排序的方法
2019/02/08 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
python在不同条件下的输入与输出
2020/02/13 Python
html5 css3实例教程 一款html5和css3实现的小机器人走路动画
2014/10/20 HTML / CSS
德国户外商店:eXXpozed
2020/07/25 全球购物
质检员的岗位职责
2013/11/15 职场文书
一个大学生十年的职业规划
2014/01/17 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
罚站检讨书
2015/01/29 职场文书
结婚堵门保证书
2015/05/08 职场文书