简单介绍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类中super()和__init__()的区别
Oct 18 Python
Python实现导出数据生成excel报表的方法示例
Jul 12 Python
Python字符编码与函数的基本使用方法
Sep 30 Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 Python
python中metaclass原理与用法详解
Jun 25 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
Aug 17 Python
python DataFrame转dict字典过程详解
Dec 26 Python
python开发实例之python使用Websocket库开发简单聊天工具实例详解(python+Websocket+JS)
Mar 18 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
python进度条显示之tqmd模块
Aug 22 Python
python MD5加密的示例
Oct 19 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 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 实现进制转换(二进制、八进制、十六进制)互相转换实现代码
2010/10/22 PHP
PHP新手NOTICE错误常见解决方法
2011/12/07 PHP
解析PHP跨站刷票的实现代码
2013/06/18 PHP
php ucwords() 函数将字符串中每个单词的首字符转换为大写(实现代码)
2016/05/12 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
2021/03/09 PHP
jquery isType() 类型判断代码
2011/02/14 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
js图片延迟加载的实现方法及思路
2013/07/22 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
javascript+HTML5的canvas实现七夕情人节3D玫瑰花效果代码
2015/08/04 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
jQuery简单绑定单个事件的方法示例
2017/06/10 jQuery
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
Postman参数化实现过程及原理解析
2020/08/13 Javascript
Python模块学习 datetime介绍
2012/08/27 Python
Python制作爬虫抓取美女图
2016/01/20 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
python实现FTP循环上传文件
2020/03/20 Python
如何理解python面向对象编程
2020/06/01 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
单身旅行者的单身假期:Just You
2018/04/08 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
南京某公司笔试题
2013/01/27 面试题
C#中的验证控件有几种
2014/03/08 面试题
酒店总经理助理职责
2014/02/12 职场文书
上下班时间调整通知
2015/04/23 职场文书
护理自荐信
2019/05/14 职场文书
MySQL系列之七 MySQL存储引擎
2021/07/02 MySQL
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android