简单介绍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翻译软件实现代码(使用google api完成)
Nov 26 Python
python通过字典dict判断指定键值是否存在的方法
Mar 21 Python
python中__call__内置函数用法实例
Jun 04 Python
Python中datetime常用时间处理方法
Jun 15 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
书单|人生苦短,你还不用python!
Dec 29 Python
Python实现爬虫爬取NBA数据功能示例
May 28 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
python对文件目录的操作方法实例总结
Jun 24 Python
pytorch动态网络以及权重共享实例
Jan 06 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
哪些是python中web开发框架
Jun 17 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
ArrayList类(增强版)
2007/04/04 Javascript
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
2015/06/19 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
p5.js实现斐波那契螺旋的示例代码
2018/03/22 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
vue实现验证用户名是否可用
2021/01/20 Vue.js
[00:06]Yes,it worked!小卡尔成功穿越时空加入战场!
2019/07/20 DOTA
Python Requests 基础入门
2016/04/07 Python
python分割列表(list)的方法示例
2017/05/07 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
对django的User模型和四种扩展/重写方法小结
2019/08/17 Python
python logging 日志的级别调整方式
2020/02/21 Python
python3注册全局热键的实现
2020/03/22 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
英国Iceland杂货店:网上食品购物
2020/12/16 全球购物
Python里面如何实现tuple和list的转换
2012/06/13 面试题
我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串?
2014/03/30 面试题
家具厂厂长岗位职责
2014/01/01 职场文书
团队经理竞聘书
2014/03/31 职场文书
大队委竞选演讲稿
2014/04/28 职场文书
小学雷锋月活动总结
2014/07/03 职场文书
夫妻分居协议书范文
2014/11/26 职场文书
丽江古城导游词
2015/02/03 职场文书
中学生逃课检讨书
2015/02/17 职场文书
致青春观后感
2015/06/09 职场文书
经营场所证明范本
2015/06/19 职场文书
强烈推荐:小学生:暑假作息时间表(值得收藏)
2019/07/09 职场文书
优秀创业计划书分享
2019/07/19 职场文书
如何在Python中妥善使用进度条详解
2022/04/05 Python