简单介绍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中bisect的用法
Sep 23 Python
Python中最常用的操作列表的几种方法归纳
Apr 24 Python
python实现文件路径和url相互转换的方法
Jul 06 Python
CentOS安装pillow报错的解决方法
Jan 27 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 Python
Python给定一个句子倒序输出单词以及字母的方法
Dec 20 Python
python gensim使用word2vec词向量处理中文语料的方法
Jul 05 Python
python实现拼图小游戏
Feb 22 Python
Python网络爬虫信息提取mooc代码实例
Mar 06 Python
用于ETL的Python数据转换工具详解
Jul 21 Python
Python实现粒子群算法的示例
Feb 14 Python
详解python第三方库的安装、PyInstaller库、random库
Mar 03 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来自动调用不同服务器上的flash
2006/10/09 PHP
php+javascript的日历控件
2009/11/19 PHP
PHP函数之日期时间函数date()使用详解
2013/09/09 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
基于jQuery的弹出框插件
2012/03/18 Javascript
用javascript模仿ie的自动完成类似自动完成功的表单
2012/12/12 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
浅谈javascript的Array.prototype.slice.call
2015/08/31 Javascript
基于javascript制作微信聊天面板
2020/08/09 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
Javascript中Promise的四种常用方法总结
2017/07/14 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
element-ui upload组件多文件上传的示例代码
2018/10/17 Javascript
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
vue2路由方式--嵌套路由实现方法分析
2020/03/06 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
Python表示矩阵的方法分析
2017/05/26 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
python之mock模块基本使用方法详解
2019/06/27 Python
python实现KNN分类算法
2019/10/16 Python
利用Python将图片中扭曲矩形的复原
2020/09/07 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
2020/12/01 Python
初探CSS3中的calc()功能
2015/07/14 HTML / CSS
中文教师求职信
2014/02/22 职场文书
个人租房协议书
2014/04/09 职场文书
组织鉴定材料
2014/06/02 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python