python 常用的模块(struct)转

准确地讲,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\[email protected]‘

非常麻烦。如果换成浮点数就无能为力了。

好在Python提供了一个struct模块来解决str和其他二进制数据类型的转换。

structpack函数把任意数据类型变成字符串:

>>> import struct
>>> struct.pack(‘>I‘, 10240099)
‘\x00\[email protected]‘

pack的第一个参数是处理指令,‘>I‘的意思是:

>表示字节顺序是big-endian,也就是网络序,I表示4字节无符号整数。

后面的参数个数要和处理指令一致。

unpackstr变成相应的数据类型:

>>> 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。

转自http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013994173393204e80af1f8fa94c8e9d094d229395ea43000

时间: 2024-11-08 10:13:21

python 常用的模块(struct)转的相关文章

[转] Python 常用第三方模块 及PIL介绍

原文地址 除了内建的模块外,Python还有大量的第三方模块. 基本上,所有的第三方模块都会在PyPI - the Python Package Index上注册,只要找到对应的模块名字,即可用pip安装. 本文介绍常用的第三方模块. 一个图像处理库PIL PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容

python 常用第三方模块

除了内建的模块外,Python还有大量的第三方模块. 基本上,所有的第三方模块都会在https://pypi.python.org/pypi上注册,只要找到对应的模块名字,即可用pip安装. 本章介绍常用的第三方模块. 1. PIL PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准库了.PIL功能非常强大,但API却非常简单易用. 由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillo

Python常用的模块

一.logging模块 1.日志级别 CRITICAL = 50 #FATAL = CRITICAL ERROR = 40 WARNING = 30 #WARN = WARNING INFO = 20 DEBUG = 10 NOTSET = 0 #不设置 2.默认级别为warning,默认打印到终端 import logging logging.debug('调试debug') logging.info('消息info') logging.warning('警告warn') logging.er

Python常用时间模块讲解

一.常用的时间格式1.时间戳格式,例如:t = 1523197272.9467547(s),单位为秒:2.结构化时间格式,例如:t=time.struct_time(tm_year=2018,tm_mon=4,tm_mday=8,tm_hour=22,tm_min=22,tm_sec=4,tm_wday=6,tm_yday=98, tm_isdst=0),里面包含年.月.日.时.分.秒.星期几(0表示周一)等:因此,可以随意取出想要的值,如下图:其实,time.localtime()是以time

Python 常用系统模块整理

Python中的常用的系统模块中部分函数等的整理 random: 随机数 sys: 系统相关 os: 系统相关的 subprocess: 执行新的进程 multiprocessing: 进程相关 threading: 线程相关 pickle: 将对象转换成二进制文件 time: 时间 datetime: 基本的日期和时间类型 timeit: 准确测量小段代码的执行时间 urllib: 访问网络的包 http.cookielib: 主要作用是提供可存储cookie的对象 socket: 套接字相关

男神鹏:python 常用的模块。

os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称('posix', 'nt', 'os2', 'mac', 'ce' or 'riscos') os中定义了一组文件.路径在不同操作系统中的表现形式参数,如 os.sep(文件夹分隔符,windows中是 \ ) os.extsep(扩展名分隔符,windows中是 . ) os.pathsep(目录分隔符,windows中是 ; ) os.l

python 常用的模块 optparse与ConfigParser

一.optparse 模块 功能:optparse模块用于处理命令行参数 使用流程: 1.首先,必须 import OptionParser 类,创建一个 OptionParser 对象: from optparse import OptionParser def Opt ():    parser=OptionParser("Usage: %prog -o option -d domain -s subject") 2.使用 add_option 来定义命令行参数:    parse

python常用小模块使用汇总

在写代码过程中常用到一些好用的小模块,现整理汇总一下: 1.获取当前的文件名和目录名,并添到系统环境变量中. file = os.path.abspath(__file__)                              #获取文件的绝对路径file_name = os.path.basename(file)                         #获取文件名file_dir = os.path.dirname(os.path.dirname(file))      #获取

Python#常用的模块和简单用法

目录 random 随机模块 os 文件夹模块: time 时间模块: matplotlab.pyplot 作图模块 mpl_toolkits.mplot3d 绘制3D图模块 Pygame Requests 请求URL: 文章导读 random 随机模块 import random code = random.choice(stock_list) # 从一个列表中随机选取元素下面是我目前经常用到的模块,为了方便使用,不是有特殊需求的话,个人觉得一开始没比亚每个模块都很深入学习,只要知道自己常用的