国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

簡單介紹Python中的struct模塊

2020-01-04 19:21:06
字體:
來源:轉載
供稿:網友

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

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

>>> 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'/x00/x9c@c'

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

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

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

>>> import struct>>> struct.pack('>I', 10240099)'/x00/x9c@c'

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

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

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

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

>>> struct.unpack('>IH', '/xf0/xf0/xf0/xf0/x80/x80')(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個字節來分析:

>>> s = '/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字節整數:表示位圖大?。?br />一個4字節整數:保留位,始終為0;
一個4字節整數:實際圖像的偏移量;
一個4字節整數:Header的字節數;
一個4字節整數:圖像寬度;
一個4字節整數:圖像高度;
一個2字節整數:始終為1;
一個2字節整數:顏色數。

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 内黄县| 瓮安县| 方山县| 会理县| 宜春市| 沈丘县| 许昌市| 淮北市| 河北省| 黔江区| 克山县| 无为县| 汉阴县| 库尔勒市| 农安县| 资溪县| 信阳市| 茂名市| 宾阳县| 政和县| 怀宁县| 科尔| 安顺市| 兰州市| 馆陶县| 泾阳县| 抚宁县| 黄山市| 县级市| 内乡县| 西平县| 抚州市| 望奎县| 临海市| 望城县| 丹阳市| 吉林市| 梅河口市| 乃东县| 铅山县| 颍上县|