在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使用append合并两个数组的方法
Apr 28 Python
Python中IPYTHON入门实例
May 11 Python
Python的爬虫框架scrapy用21行代码写一个爬虫
Apr 24 Python
python使用numpy读取、保存txt数据的实例
Oct 14 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
opencv转换颜色空间更改图片背景
Aug 20 Python
python实现密度聚类(模板代码+sklearn代码)
Apr 27 Python
10个python爬虫入门实例(小结)
Nov 01 Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 Python
利于python脚本编写可视化nmap和masscan的方法
Dec 29 Python
python实现进度条的多种实现
Apr 29 Python
python 单机五子棋对战游戏
Apr 28 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
DC四月将推出百页特刊漫画 纪念小丑诞生80周年
2020/04/09 欧美动漫
PHP批量删除jQuery操作
2017/07/23 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
jquery 淡入淡出效果的简单实现
2014/02/07 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
Node.js入门教程:在windows和Linux上安装配置Node.js图文教程
2014/08/14 Javascript
js实现商品抛物线加入购物车特效
2020/11/18 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
2016/09/19 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
使用Angular-CLI构建NPM包的方法
2018/09/07 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
python 实现矩阵上下/左右翻转,转置的示例
2019/01/23 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
python实现字符串加密成纯数字
2019/03/19 Python
python获取Pandas列名的几种方法
2019/08/07 Python
用Python爬取QQ音乐评论并制成词云图的实例
2019/08/24 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
室内设计专业个人的自我评价
2013/10/19 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
原料仓管员岗位职责
2014/04/12 职场文书
五四演讲稿范文
2014/09/03 职场文书
学校党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
七一慰问简报
2015/07/20 职场文书
2016拓展训练心得体会范文
2016/01/12 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
奇妙的 CSS shapes(CSS图形)
2021/04/05 HTML / CSS
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS
Java 超详细讲解hashCode方法
2022/04/07 Java/Android