码迷,mamicode.com
首页 > 其他好文 > 详细

struct

时间:2018-03-24 12:46:06      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:类型   符号   偏移量   mpi   结果   body   函数   pytho   color   

 

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

struct的pack函数把任意数据类型变成bytes:

>>> import struct
>>> struct.pack(‘>I‘, 10240099)
b‘\x00\x9c@c‘
pack的第一个参数是处理指令,‘>I‘的意思是:

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

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

unpack把bytes变成相应的数据类型:

>>> struct.unpack(‘>IH‘, b‘\xf0\xf0\xf0\xf0\x80\x80‘)
(4042322160, 32896)
根据>IH的说明,后面的bytes依次变为I:4字节无符号整数和H:2字节无符号整数。

首先找一个bmp文件。

读入前30个字节来分析:

>>> s = b‘\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‘B‘, b‘M‘, 691256, 0, 54, 40, 640, 360, 1, 24)


结果显示,b‘B‘、b‘M‘说明是Windows位图,位图大小为640x360,颜色数为24

 

读入数据

import struct
file_object=open(‘0222.bmp‘,‘rb‘)
aa=file_object.read()[:30]
bt=struct.unpack(‘<ccIIIIIIHH‘,aa)
file_object.close()
bt


编写一个bmpinfo.py,可以检查任意文件是否是位图文件,如果是,打印出图片大小和颜色数

def bmp_info(data):
result = struct.unpack(‘<ccIIIIIIHH‘, data[:30])
if result[0] == b‘B‘ and result[1] == b‘M‘:
return {
‘width‘: result[6],
‘height‘: result[7],
‘color‘: result[9]
}

 

struct

标签:类型   符号   偏移量   mpi   结果   body   函数   pytho   color   

原文地址:https://www.cnblogs.com/wander-clouds/p/8491857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!