简单介绍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实例分享:快速查找出被挂马的文件
Jun 08 Python
举例讲解Python程序与系统shell交互的方式
Apr 09 Python
Python科学计算之NumPy入门教程
Jan 15 Python
Python中py文件引用另一个py文件变量的方法
Apr 29 Python
python 文件转成16进制数组的实例
Jul 09 Python
win10 64bit下python NLTK安装教程
Sep 19 Python
pandas.dataframe按行索引表达式选取方法
Oct 30 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
Python SSL证书验证问题解决方案
Jan 13 Python
使用Python来做一个屏幕录制工具的操作代码
Jan 18 Python
Django中modelform组件实例用法总结
Feb 10 Python
python实战之90行代码写个猜数字游戏
Apr 22 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
用PHP编写PDF文档生成器
2006/10/09 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
PHP实现八皇后算法
2019/05/06 PHP
JavaScript中的类继承
2010/11/25 Javascript
jquery阻止冒泡事件使用模拟事件
2013/09/06 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
AngularJs中route的使用方法和配置
2016/02/04 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
2018/03/14 Javascript
Node.Js中实现端口重用原理详解
2018/05/03 Javascript
JS实现点击生成UUID的方法完整实例【基于jQuery】
2019/06/12 jQuery
python实现获取序列中最小的几个元素
2014/09/25 Python
Python实现抓取城市的PM2.5浓度和排名
2015/03/19 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
Python基于Flask框架配置依赖包信息的项目迁移部署
2018/03/02 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
Python安装与卸载流程详细步骤(图解)
2020/02/20 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
CSS3 please 跨浏览器的CSS3产生器
2010/03/14 HTML / CSS
HTML5新增加的功能详解
2016/09/05 HTML / CSS
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
法国在线药房:1001Pharmacies
2021/03/07 全球购物
后勤自我鉴定
2013/10/13 职场文书
应届大学生求职信
2013/12/01 职场文书
会议邀请函范文
2014/01/09 职场文书
县委班子四风对照检查材料思想汇报
2014/09/29 职场文书
详解Redis主从复制实践
2021/05/19 Redis
Golang实现可重入锁的示例代码
2022/05/25 Golang