简单介绍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 元类使用说明
Dec 18 Python
python中函数总结之装饰器闭包详解
Jun 12 Python
谈谈如何手动释放Python的内存
Dec 17 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
儿童python练习实例
May 27 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
基于python实现高速视频传输程序
May 05 Python
pytorch 模型的train模式与eval模式实例
Feb 20 Python
vue常用指令代码实例总结
Mar 16 Python
Python如何输出百分比
Jul 31 Python
Django如何重置migration的几种情景
Feb 24 Python
教你使用Pandas直接核算Excel中快递费用
May 12 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
一个ORACLE分页程序,挺实用的.
2006/10/09 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
2011/06/28 PHP
PHP 断点续传实例详解
2017/11/11 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
用Javascript实现Windows任务管理器的代码
2012/03/27 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
基于javascript如何传递特殊字符
2015/11/30 Javascript
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
ReactJS实现表单的单选多选和反选的示例
2017/10/13 Javascript
Vue实现6位数密码效果
2018/08/18 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
JavaScript实现美化滑块效果
2019/05/17 Javascript
Vue-CLI项目中路由传参的方式详解
2019/09/01 Javascript
解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题
2020/07/21 Javascript
[00:32]2016完美“圣”典风云人物:Maybe宣传片
2016/12/05 DOTA
wxPython事件驱动实例详解
2014/09/28 Python
Python中的map()函数和reduce()函数的用法
2015/04/27 Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
2015/08/16 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
Django choices下拉列表绑定实例
2020/03/13 Python
python数据类型强制转换实例详解
2020/06/22 Python
Python如何使用input函数获取输入
2020/08/06 Python
Python实现自动装机功能案例分析
2020/10/22 Python
html5+css3之制作header实例与更新
2020/12/21 HTML / CSS
成品仓管员岗位职责
2013/12/11 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
写给爸爸的道歉信
2014/01/15 职场文书
银行类自荐信
2014/02/04 职场文书
小学生期末评语大全
2014/04/21 职场文书
中考标语大全
2014/06/05 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
小学教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
体育部部长竞选稿
2015/11/21 职场文书