简单介绍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控制台显示时钟的示例
Feb 24 Python
python 时间戳与格式化时间的转化实现代码
Mar 23 Python
Python扩展内置类型详解
Mar 26 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
python 字符串常用函数详解
Sep 11 Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 Python
用Python制作灯光秀短视频的思路详解
Apr 13 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
PHP4与PHP5的时间格式问题
2008/02/17 PHP
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
ThinkPHP开发框架函数详解:C方法
2015/08/14 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
PHP如何解决微信文章图片防盗链
2020/12/09 PHP
js 函数的副作用分析
2011/08/23 Javascript
提示$ is not defined错误分析及解决
2013/04/09 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
微信小程序之页面跳转和参数传递的实现
2017/09/29 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
2017/11/28 Javascript
vue注册组件的几种方式总结
2018/03/08 Javascript
js中Array对象的常用遍历方法详解
2019/01/17 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
小程序如何写动态标签的实现方法
2020/02/05 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
vue-router之解决addRoutes使用遇到的坑
2020/07/19 Javascript
python 输出上个月的月末日期实例
2018/04/11 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
Tensorflow模型实现预测或识别单张图片
2019/07/19 Python
linux环境下Django的安装配置详解
2019/07/22 Python
Python turtle画图库&amp;&amp;画姓名实例
2020/01/19 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
一个入门级python爬虫教程详解
2021/01/27 Python
python tkinter实现下载进度条及抖音视频去水印原理
2021/02/07 Python
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
strstr()的简单实现
2013/09/26 面试题
好的自荐信包括什么内容
2013/11/07 职场文书
《我的信念》教学反思
2014/02/15 职场文书
环境工程专业自荐信范文
2014/03/18 职场文书
施工员岗位职责
2015/02/10 职场文书
浅谈MySQL中的六种日志
2022/03/23 MySQL