简单介绍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 字典(Dictionary)操作详解
Mar 11 Python
python+selenium+autoit实现文件上传功能
Aug 23 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
Python3.6使用tesseract-ocr的正确方法
Oct 17 Python
pymongo中聚合查询的使用方法
Mar 22 Python
django model通过字典更新数据实例
Apr 01 Python
django在开发中取消外键约束的实现
May 20 Python
keras实现多种分类网络的方式
Jun 11 Python
python从Oracle读取数据生成图表
Oct 14 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
Selenium 安装和简单使用的实现
Dec 04 Python
opencv实现图像几何变换
Mar 24 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
MongoDB在PHP中的常用操作小结
2014/02/20 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
禁止iframe页面的所有js脚本如alert及弹出窗口等
2014/09/03 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
iscroll碰到Select无法选择下拉刷新的解决办法
2016/05/21 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
2016/06/13 Javascript
JavaScript 中有关数组对象的方法(详解)
2016/08/15 Javascript
Vue.js实现无限加载与分页功能开发
2016/11/03 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
vue中的适配px2rem示例代码
2018/11/19 Javascript
微信小程序使用wxParse解析html的方法示例
2019/01/17 Javascript
vue实现拖拽效果
2019/12/23 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
Python 模块EasyGui详细介绍
2017/02/19 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
python判断正负数方式
2020/06/03 Python
解决Python 写文件报错TypeError的问题
2020/10/23 Python
Django使用django-simple-captcha做验证码的实现示例
2021/01/07 Python
canvas实现图片马赛克的示例代码
2018/03/26 HTML / CSS
Html5中localStorage存储JSON数据并读取JSON数据的实现方法
2017/02/13 HTML / CSS
匈牙利墨盒和碳粉购买网站:CDRmarket
2018/04/14 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
英文简历中的自荐信范文
2013/12/14 职场文书
四风问题查摆材料
2014/08/25 职场文书
领导班子对照检查材料
2014/09/22 职场文书
教师自查自纠材料
2014/10/14 职场文书
2015年电教工作总结
2015/05/26 职场文书
法律服务所工作总结
2015/08/10 职场文书
Python find()、rfind()方法及作用
2022/12/24 Python