在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使用smtplib模块通过gmail实现邮件发送的方法
May 08 Python
Python的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
利用python写个下载teahour音频的小脚本
May 08 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
Django框架教程之正则表达式URL误区详解
Jan 28 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
Python中pandas模块DataFrame创建方法示例
Jun 20 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
mac在matplotlib中显示中文的操作方法
Mar 06 Python
使用python实现名片管理系统
Jun 18 Python
Java Unsafe类实现原理及测试代码
Sep 15 Python
python 多线程中join()的作用
Oct 29 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 文件缓存的性能测试
2010/04/25 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
PHP判断是否连接上网络的方法
2015/07/01 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
一步一步教你写一个jQuery的插件教程(Plugin)
2009/09/03 Javascript
编写Js代码要注意的几条规则
2010/09/10 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
javascript:void(0)点击登录没反应怎么解决
2015/11/13 Javascript
javascript 将共享属性迁移到原型中去的实现方法
2016/08/31 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
详解如何在react中搭建d3力导向图
2018/01/12 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
详解使用python crontab设置linux定时任务
2016/12/08 Python
python 中if else 语句的作用及示例代码
2018/03/05 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
python接入支付宝的实例操作
2020/07/20 Python
pandas apply多线程实现代码
2020/08/17 Python
使用HTML5 Canvas绘制直线或折线等线条的方法讲解
2016/03/14 HTML / CSS
HTML5 对各个标签的定义与规定:body的介绍
2012/06/21 HTML / CSS
Shell如何接收变量输入
2012/09/24 面试题
经济信息系毕业生自荐信范文
2014/03/15 职场文书
社团活动总结模板
2014/06/30 职场文书
地质工程专业毕业生求职信
2014/08/08 职场文书
团队拓展活动总结
2014/08/27 职场文书
安全温馨提示语大全
2015/07/14 职场文书
Go 语言结构实例分析
2021/07/04 Golang
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js