程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Python中的struct模塊介紹

Python中的struct模塊介紹

編輯:更多關於編程

       這篇文章主要介紹了Python中的struct模塊,代碼基於Python2.x版本,需要的朋友可以參考下

      准確地講,Python沒有專門處理字節的數據類型。但由於str既是字符串,又可以表示字節,所以,字節數組=str。而在C語言中,我們可以很方便地用struct、union來處理字節,以及字節和int,float的轉換。

      在Python中,比方說要把一個32位無符號整數變成字節,也就是4個長度的str,你得配合位運算符這麼寫:

      ?

    1 2 3 4 5 6 7 8 >>> 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 'x00x9c@c'

      非常麻煩。如果換成浮點數就無能為力了。

      好在Python提供了一個struct模塊來解決str和其他二進制數據類型的轉換。

      struct的pack函數把任意數據類型變成字符串:

      ?

    1 2 3 >>> import struct >>> struct.pack('>I', 10240099) 'x00x9c@c'

      pack的第一個參數是處理指令,'>I'的意思是:

      >表示字節順序是big-endian,也就是網絡序,I表示4字節無符號整數。

      後面的參數個數要和處理指令一致。

      unpack把str變成相應的數據類型:

      ?

    1 2 >>> struct.unpack('>IH', 'xf0xf0xf0xf0x80x80') (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個字節來分析:

      ?

    1 >>> s = 'x42x4dx38x8cx0ax00x00x00x00x00x36x00x00x00x28x00x00x00x80x02x00x00x68x01x00x00x01 x00x18x00'

      BMP格式采用小端方式存儲數據,文件頭的結構按順序如下:

      兩個字節:'BM'表示Windows位圖,'BA'表示OS/2位圖;

      一個4字節整數:表示位圖大小;

      一個4字節整數:保留位,始終為0;

      一個4字節整數:實際圖像的偏移量;

      一個4字節整數:Header的字節數;

      一個4字節整數:圖像寬度;

      一個4字節整數:圖像高度;

      一個2字節整數:始終為1;

      一個2字節整數:顏色數。

      所以,組合起來用unpack讀取:

      ?

    1 2 >>> struct.unpack('<ccIIIIIIHH', s) ('B', 'M', 691256, 0, 54, 40, 640, 360, 1, 24)

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

      請編寫一個bmpinfo.py,可以檢查任意文件是否是位圖文件,如果是,打印出圖片大小和顏色數。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved