zoukankan      html  css  js  c++  java
  • struct

     

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

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

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

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

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

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

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

    首先找一个bmp文件。

    读入前30个字节来分析:

    >>> s = b'x42x4dx38x8cx0ax00x00x00x00x00x36x00x00x00x28x00x00x00x80x02x00x00x68x01x00x00x01x00x18x00'
    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]
    }

     

    朝闻道
  • 相关阅读:
    Tree(未解决。。。)
    Fractal(递归,好题)
    Scrambled Polygon(凸多边形,斜率)
    ZYB's Game(博弈)
    Dancing Stars on Me(判断正多边形)
    Hidden String(深搜)
    1043
    TEX Quotes(字符串,水)
    Candy Sharing Game(模拟搜索)
    hpu校赛--雪人的高度(离散化线段树)
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/8491857.html
Copyright © 2011-2022 走看看