简单介绍Python中的struct模块

 更新时间:2015年04月28日 17:30:52   作者:廖雪峰  
这篇文章主要介绍了Python中的struct模块,代码基于Python2.x版本,需要的朋友可以参考下

准确地讲,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中Random和Math模块学习笔记

    Python中Random和Math模块学习笔记

    这篇文章主要介绍了Python中Random和Math模块学习笔记,本文讲解了math模块的数学常量、常用简单函数、三角函数等,讲解了random模块的常用函数、随机挑选和排序等内容,需要的朋友可以参考下
    2015-05-05
  • Prometheus开发中间件Exporter过程详解

    Prometheus开发中间件Exporter过程详解

    这篇文章主要介绍了Prometheus开发中间件Exporter过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • python项目打包成exe和安装包的方法步骤

    python项目打包成exe和安装包的方法步骤

    本文主要介绍了python项目打包成exe和安装包的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • TensorFlow加载模型时出错的解决方式

    TensorFlow加载模型时出错的解决方式

    今天小编就为大家分享一篇TensorFlow加载模型时出错的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • Python Flask上下文管理机制实例解析

    Python Flask上下文管理机制实例解析

    这篇文章主要介绍了Python Flask上下文管理机制实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • pytorch + visdom CNN处理自建图片数据集的方法

    pytorch + visdom CNN处理自建图片数据集的方法

    这篇文章主要介绍了pytorch + visdom CNN处理自建图片数据集的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Pycharm安装第三方库时Non-zero exit code错误解决办法

    Pycharm安装第三方库时Non-zero exit code错误解决办法

    这篇文章主要介绍了Pycharm安装第三方库时Non-zero exit code错误解决办法,最好的解决办法可以通过“Pycharm”左下角的“Terminal”,在pycharm内使用pip安装,以安装“requests”为例,需要的朋友可以参考下
    2023-01-01
  • Python中的getter与setter及deleter使用示例讲解

    Python中的getter与setter及deleter使用示例讲解

    这篇文章主要介绍了Python中的getter与setter及deleter使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • python 多线程爬取壁纸网站的示例

    python 多线程爬取壁纸网站的示例

    这篇文章主要介绍了python 多线程爬取壁纸网站的示例,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-02-02
  • Python字符串逆序的实现方法【一题多解】

    Python字符串逆序的实现方法【一题多解】

    今天小编就为大家分享一篇关于Python字符串逆序的实现方法【一题多解】,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02

最新评论