• 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]
    }

     

    朝闻道
  • 相关阅读:
    Struts2SpringHibernate整合示例,一个HelloWorld版的在线书店(项目源码+详尽注释+单元测试)
    Java实现蓝桥杯勇者斗恶龙
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 226 翻转二叉树
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 225 用队列实现栈
    Java实现 LeetCode 224 基本计算器
    Java实现 LeetCode 224 基本计算器
  • 原文地址:https://www.cnblogs.com/wander-clouds/p/8491857.html
Copyright © 2020-2023  润新知