Python學習筆記__12.4章 struct

來源:互聯網
上載者:User

標籤:程式設計語言   Python   

# 這是學習廖雪峰老師python教程的學習筆記

1、概覽

struct模組用於解決bytes和其他位元據類型的轉換

 

        1)struct的pack函數把任意資料類型變成bytes:

>>> import struct

>>> struct.pack('>I', 10240099)

b'\x00\[email protected]'

pack的參數:

第一個參數是處理指示:

'>I'的意思是:>表示位元組順序是big-endian,也就是網路位元組序,I表示4位元組不帶正負號的整數。

第二個參數是傳入的參數:

傳入的參數個數要和處理指示一致。

 

        2)unpack把bytes變成相應的資料類型:

>>> struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80')

(4042322160, 32896)

根據>IH的說明,後面的bytes依次變為:

I:4位元組不帶正負號的整數和 H:2位元組不帶正負號的整數。

        3)bmp檔案的unpack

# 用畫圖,畫一個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'

# 用unpack讀取

>>> struct.unpack('<ccIIIIIIHH', s)  # < 表示位元組序是主機位元組序 Little endian

(b'B', b'M', 691256, 0, 54, 40, 640, 360, 1, 24)

兩個位元組:'BM'表示Windows位元影像,'BA'表示OS/2位元影像;

一個4位元組整數:表示位元影像大小;

一個4位元組整數:保留位,始終為0;

一個4位元組整數:實際映像的位移量;

一個4位元組整數:Header的位元組數;

一個4位元組整數:映像寬度;

一個4位元組整數:映像高度;

一個2位元組整數:始終為1;

一個2位元組整數:顏色數。

結果顯示,b'B'、b'M'說明是Windows位元影像,位元影像大小為640x360,顏色數為24。

        4)參考文檔

struct模組定義的資料類型 (https://docs.python.org/3/library/struct.html#format-characters)

Python網路位元組序和主機位元組序 (https://www.linuxidc.com/Linux/2014-02/97157.htm)

2、例子

1、編寫一個bmpinfo.py,可以檢查任意檔案是否是位元影像檔案,如果是,列印出圖片大小和顏色數

# -*- coding: utf-8 -*-

import base64, struct

bmp_data = base64.b64decode('Qk1oAgAAAAAAADYAAAAoAAAAHAAAAAoAAAABABAAAAAAADICAAASCwAAEgsAAAAAAAAAAAAA/3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9/AHwAfAB8AHwAfAB8AHwAfP9//3//fwB8AHwAfAB8/3//f/9/AHwAfAB8AHz/f/9//3//f/9//38AfAB8AHwAfAB8AHwAfAB8AHz/f/9//38AfAB8/3//f/9//3//fwB8AHz/f/9//3//f/9//3//f/9/AHwAfP9//3//f/9/AHwAfP9//3//fwB8AHz/f/9//3//f/9/AHwAfP9//3//f/9//3//f/9//38AfAB8AHwAfAB8AHwAfP9//3//f/9/AHwAfP9//3//f/9//38AfAB8/3//f/9//3//f/9//3//fwB8AHwAfAB8AHwAfAB8/3//f/9//38AfAB8/3//f/9//3//fwB8AHz/f/9//3//f/9//3//f/9/AHwAfP9//3//f/9/AHwAfP9//3//fwB8AHz/f/9/AHz/f/9/AHwAfP9//38AfP9//3//f/9/AHwAfAB8AHwAfAB8AHwAfAB8/3//f/9/AHwAfP9//38AfAB8AHwAfAB8AHwAfAB8/3//f/9//38AfAB8AHwAfAB8AHwAfAB8/3//f/9/AHwAfAB8AHz/fwB8AHwAfAB8AHwAfAB8AHz/f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//3//f/9//38AAA==')

 

def bmp_info(data):

    str=struct.unpack('<ccIIIIIIHH',data[:30]) #bytes類也有切片方法

    if str[0]==b'B' and str[1]==b'M':

        print("這是位元影像檔案")

        return {

            'width': str[-4],

            'height': str[-3],

            'color': str[-1]

                }

    else:

        print("這不是位元影像檔案")

# 測試

bi = bmp_info(bmp_data)

assert bi['width'] == 28

assert bi['height'] == 10

assert bi['color'] == 16

print('ok')


Python學習筆記__12.4章 struct

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.