简单介绍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使用shelve模块实现简单数据存储的方法
May 20 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
python 用下标截取字符串的实例
Dec 25 Python
浅谈Python 多进程默认不能共享全局变量的问题
Jan 11 Python
python多线程调用exit无法退出的解决方法
Feb 18 Python
django celery redis使用具体实践
Apr 08 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
Python使用shutil模块实现文件拷贝
Jul 31 Python
python实现人工蜂群算法
Sep 18 Python
Python通过m3u8文件下载合并ts视频的操作
Apr 16 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
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
常用的php ADODB使用方法集锦
2008/03/25 PHP
php二维数组转成字符串示例
2014/02/17 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
PHP实现文件下载【实例分享】
2017/04/28 PHP
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
Webpack 实现 Node.js 代码热替换
2015/10/22 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
详解JS中的快速排序与冒泡
2017/01/10 Javascript
vue实现的双向数据绑定操作示例
2018/12/04 Javascript
详解如何用webpack4从零开始构建react开发环境
2019/01/27 Javascript
微信小程序 简易计算器实现代码实例
2019/09/02 Javascript
基于Vue CSR的微前端实现方案实践
2020/05/27 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
[36:22]VP vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python中subprocess模块用法实例详解
2015/05/20 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
python3使用matplotlib绘制散点图
2019/03/19 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
python修改FTP服务器上的文件名
2019/09/11 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
欧洲最大的滑雪假期供应商之一:Sunweb Holidays
2018/01/06 全球购物
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
学习保证书范文
2014/04/30 职场文书
文体活动总结范文
2014/05/05 职场文书
2014年教师政治学习材料
2014/06/02 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
2016年社区国庆节活动总结
2016/04/01 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书