简单介绍Python中的struct模块


Posted in Python onApril 28, 2015

准确地讲,Python没有专门处理字节的数据类型。但由于str既是字符串,又可以表示字节,所以,字节数组=str。而在C语言中,我们可以很方便地用struct、union来处理字节,以及字节和int,float的转换。

在Python中,比方说要把一个32位无符号整数变成字节,也就是4个长度的str,你得配合位运算符这么写:

>>> n = 10240099
>>> b1 = chr((n & 0xff000000) >> 24)
>>> b2 = chr((n & 0xff0000) >> 16)
>>> b3 = chr((n & 0xff00) >> 8)
>>> b4 = chr(n & 0xff)
>>> s = b1 + b2 + b3 + b4
>>> s
'\x00\x9c@c'

非常麻烦。如果换成浮点数就无能为力了。

好在Python提供了一个struct模块来解决str和其他二进制数据类型的转换。

struct的pack函数把任意数据类型变成字符串:

>>> import struct
>>> struct.pack('>I', 10240099)
'\x00\x9c@c'

pack的第一个参数是处理指令,'>I'的意思是:

>表示字节顺序是big-endian,也就是网络序,I表示4字节无符号整数。

后面的参数个数要和处理指令一致。

unpack把str变成相应的数据类型:

>>> struct.unpack('>IH', '\xf0\xf0\xf0\xf0\x80\x80')
(4042322160, 32896)

根据>IH的说明,后面的str依次变为I:4字节无符号整数和H:2字节无符号整数。

所以,尽管Python不适合编写底层操作字节流的代码,但在对性能要求不高的地方,利用struct就方便多了。

struct模块定义的数据类型可以参考Python官方文档:

https://docs.python.org/2/library/struct.html#format-characters

Windows的位图文件(.bmp)是一种非常简单的文件格式,我们来用struct分析一下。

首先找一个bmp文件,没有的话用“画图”画一个。

读入前30个字节来分析:

>>> s = '\x42\x4d\x38\x8c\x0a\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\x68\x01\x00\x00\x01\x00\x18\x00'

BMP格式采用小端方式存储数据,文件头的结构按顺序如下:

两个字节:'BM'表示Windows位图,'BA'表示OS/2位图;
一个4字节整数:表示位图大小;
一个4字节整数:保留位,始终为0;
一个4字节整数:实际图像的偏移量;
一个4字节整数:Header的字节数;
一个4字节整数:图像宽度;
一个4字节整数:图像高度;
一个2字节整数:始终为1;
一个2字节整数:颜色数。

所以,组合起来用unpack读取:

>>> struct.unpack('<ccIIIIIIHH', s)
('B', 'M', 691256, 0, 54, 40, 640, 360, 1, 24)

结果显示,'B'、'M'说明是Windows位图,位图大小为640x360,颜色数为24。

请编写一个bmpinfo.py,可以检查任意文件是否是位图文件,如果是,打印出图片大小和颜色数。

Python 相关文章推荐
python创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
python Pandas 读取txt表格的实例
Apr 29 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
浅谈python写入大量文件的问题
Nov 09 Python
Python设计模式之简单工厂模式实例详解
Jan 22 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
python系列 文件操作的代码
Oct 06 Python
Python中bisect的用法及示例详解
Jul 20 Python
python单例模式的应用场景实例讲解
Feb 24 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 Python
在Python中使用base64模块处理字符编码的教程
Apr 28 #Python
使用Python的内建模块collections的教程
Apr 28 #Python
进一步探究Python中的正则表达式
Apr 28 #Python
在Python程序中实现分布式进程的教程
Apr 28 #Python
浅析Python多线程下的变量问题
Apr 28 #Python
python实现向ppt文件里插入新幻灯片页面的方法
Apr 28 #Python
Python实现对PPT文件进行截图操作的方法
Apr 28 #Python
You might like
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
Memcached常用命令以及使用说明详解
2013/06/27 PHP
php上传文件并显示上传进度的方法
2015/03/24 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
jQuery $命名冲突解决方案汇总
2014/11/13 Javascript
什么是 AngularJS?AngularJS简介
2014/12/06 Javascript
javascript自定义in_array()函数实现方法
2015/08/03 Javascript
理解javascript异步编程
2016/01/27 Javascript
JS判断图片是否加载完成方法汇总(最新版)
2016/05/13 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
详解element-ui中el-select的默认选择项问题
2019/08/02 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
JavaScript实现背景自动切换小案例
2019/09/27 Javascript
JavaScript实现PC端横向轮播图
2020/02/07 Javascript
基于Vue.js+Nuxt开发自定义弹出层组件
2020/10/09 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
python共享引用(多个变量引用)示例代码
2013/12/04 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
基于python3 类的属性、方法、封装、继承实例讲解
2017/09/19 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
树莓派极简安装OpenCv的方法步骤
2019/10/10 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
Blue Nile中国官网:全球知名的钻石和珠宝网络零售商
2020/03/22 全球购物
酒店管理专业毕业生推荐信
2013/11/10 职场文书
名人演讲稿范文
2013/12/28 职场文书
小学生元旦广播稿
2014/02/21 职场文书
幼儿园师德师风学习材料
2014/05/29 职场文书
初中同学会致辞
2015/08/01 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
pycharm无法导入lxml的解决办法
2021/03/31 Python
Spring Security动态权限的实现方法详解
2022/06/16 Java/Android