简单介绍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中__call__方法示例分析
Oct 11 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
python实现装饰器、描述符
Feb 28 Python
Python实现统计给定字符串中重复模式最高子串功能示例
May 16 Python
django初始化数据库的实例
May 27 Python
Python matplotlib画图与中文设置操作实例分析
Apr 23 Python
8种用Python实现线性回归的方法对比详解
Jul 10 Python
Python单元测试工具doctest和unittest使用解析
Sep 02 Python
python实现简单飞行棋
Feb 06 Python
Python Tornado之跨域请求与Options请求方式
Mar 28 Python
keras实现基于孪生网络的图片相似度计算方式
Jun 11 Python
PyQt5结合matplotlib绘图的实现示例
Sep 15 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
MySQL修改密码方法总结
2008/03/25 PHP
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
php实现webservice实例
2014/11/06 PHP
php模拟post提交数据的方法
2015/02/12 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
基于jquery实现后台左侧菜单点击上下滑动显示
2013/04/11 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
利用javascript实现禁用网页上所有文本框,下拉菜单,多行文本域
2013/12/14 Javascript
js采用concat和sort将N个数组拼接起来的方法
2016/01/21 Javascript
基于jquery实现三级下拉菜单
2016/05/10 Javascript
Bootstrap3 Grid system原理及应用详解
2016/09/30 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
js实现有趣的倒计时效果
2021/01/19 Javascript
[05:13]TI4 中国战队 机场出征!!
2014/07/07 DOTA
Python的垃圾回收机制深入分析
2014/07/16 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
python 实现selenium断言和验证的方法
2019/02/13 Python
Python Numpy 自然数填充数组的实现
2019/11/28 Python
使用python turtle画高达
2020/01/19 Python
tensorflow多维张量计算实例
2020/02/11 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
幼教求职信
2014/03/12 职场文书
大学课外活动总结
2014/07/09 职场文书
励志演讲稿大全
2014/08/21 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
建筑工程材料员岗位职责
2015/04/11 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书
毕业论文致谢范文
2015/05/14 职场文书
nginx实现发布静态资源的方法
2021/03/31 Servers
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
铁拳制作人赞《铁拳7》老头环Mod:制作精良 但别弄了
2022/04/03 其他游戏