在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的加密模块md5、sha、crypt使用实例
Sep 28 Python
python爬虫入门教程--利用requests构建知乎API(三)
May 25 Python
python增加矩阵维度的实例讲解
Apr 04 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
Python基于FTP模块实现ftp文件上传操作示例
Apr 23 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
Python解决两个整数相除只得到整数部分的实例
Nov 10 Python
Python使用Pandas库实现MySQL数据库的读写
Jul 06 Python
Python实现微信好友的数据分析
Dec 16 Python
ansible动态Inventory主机清单配置遇到的坑
Jan 19 Python
Python使用20行代码实现微信聊天机器人
Jun 05 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 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
PHP3 safe_mode 失效漏洞
2006/10/09 PHP
php flush类输出缓冲剖析
2008/10/19 PHP
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
JavaScript 常用函数
2009/12/30 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
让你一句话理解闭包(简单易懂)
2016/06/03 Javascript
浅谈JS之tagNaem和nodeName
2016/09/13 Javascript
jquery插件bootstrapValidator数据验证详解
2016/11/09 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
微信小程序 websocket 实现SpringMVC+Spring+Mybatis
2017/08/04 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
AngularJS实现的自定义过滤器简单示例
2019/02/02 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略
2019/06/04 Javascript
详解vue-property-decorator使用手册
2019/07/29 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
JavaScript进阶(三)闭包原理与用法详解
2020/05/09 Javascript
JavaScript检测是否开启了控制台(F12调试工具)
2020/10/02 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
Python3.x中自定义比较函数
2015/04/24 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
2017/12/28 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
pandas 数据结构之Series的使用方法
2019/06/21 Python
python Dijkstra算法实现最短路径问题的方法
2019/09/19 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
2013年保送生自荐信格式
2013/11/20 职场文书
室内设计专业学生的自我评价分享
2013/11/27 职场文书
业务内勤岗位职责
2014/04/30 职场文书
信息员培训方案
2014/06/12 职场文书
大学生找工作求职信
2014/07/09 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
领导班子党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
《法国号》教学反思
2016/02/22 职场文书