简单介绍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根据unicode判断语言类型实例代码
Jan 17 Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 Python
详解Django rest_framework实现RESTful API
May 24 Python
Pandas GroupBy对象 索引与迭代方法
Nov 16 Python
python爬取指定微信公众号文章
Dec 20 Python
Python从函数参数类型引出元组实例分析
May 28 Python
安装Pycharm2019以及配置anconda教程的方法步骤
Nov 11 Python
python统计文章中单词出现次数实例
Feb 27 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
Sep 29 Python
Django利用elasticsearch(搜索引擎)实现搜索功能
Nov 26 Python
Django如何与Ajax交互
Apr 29 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
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
2010/05/04 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
浅析PHP中Session可能会引起并发问题
2015/07/23 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
JQuery入门——移除绑定事件unbind方法概述及应用
2013/02/05 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
jQuery中:nth-child选择器用法实例
2014/12/31 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
javascript的replace方法结合正则使用实例总结
2016/06/16 Javascript
原生javascript实现的ajax异步封装功能示例
2016/11/03 Javascript
JS验证输入的是否是数字及保留几位小数问题
2018/05/09 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
vue引用外部JS的两种种方法
2020/01/28 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
利用python实现命令行有道词典的方法示例
2017/01/31 Python
matplotlib实现区域颜色填充
2019/03/18 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
Python自定义聚合函数merge与transform区别详解
2020/05/26 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
什么是python的自省
2020/06/21 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
比利时家具购买网站:Home24
2019/01/03 全球购物
乐高瑞士官方商店:LEGO CH
2020/08/16 全球购物
会计与审计专业大专生求职信
2013/10/03 职场文书
班组长岗位职责范本
2014/01/05 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
《桥》教学反思
2014/04/09 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
安装工程师岗位职责
2015/02/13 职场文书
人事任命通知书
2015/04/21 职场文书
工作证明格式范文
2015/06/15 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书
导游词之寿县报恩寺
2020/01/19 职场文书