Python模塊學(xué)習(xí)之struct模塊詳解
struct模塊提供了用于在字節(jié)字符串和Pytdon原生數(shù)據(jù)類型之間轉(zhuǎn)換函數(shù),比如數(shù)字和字符串。
該模塊作用是完成Pytdon數(shù)值和C語言結(jié)構(gòu)體的Pytdon字符串形式間的轉(zhuǎn)換。 這可以用于處理存儲在文件中或從網(wǎng)絡(luò)連接中存儲的二進(jìn)制數(shù)據(jù),以及其他數(shù)據(jù)源。
1. 模塊函數(shù)和Struct類
它除了提供一個Struct類之外,還有許多模塊級的函數(shù)用于處理結(jié)構(gòu)化的值。這里有個格式符(Format specifiers)的概念,是指從字符串格式轉(zhuǎn)換為已編譯的表示形式,類似于正則表達(dá)式的處理方式。通常實例化Struct類,調(diào)用類方法來完成轉(zhuǎn)換,比直接調(diào)用模塊函數(shù)有效的多。
下面的例子都是使用Struct類。
2. Packing(打包)和Unpacking(解包)
Struct支持將數(shù)據(jù)packing(打包)成字符串,并能從字符串中逆向unpacking(解壓)出數(shù)據(jù)。
在本例中,格式指定器(specifier)需要一個整型或長整型,一個兩個字節(jié)的string,和一個浮點數(shù)。格式符中的空格用于分隔各個指示器(indicators),在編譯格式時會被忽略。
import struct import binascii values = (1, 'ab'.encode('utf-8'), 2.7) s = struct.Struct('I 2s f') packed_data = s.pack(*values) print('原始值:', values) print('格式符:', s.format) print('占用字節(jié):', s.size) print('打包結(jié)果:', binascii.hexlify(packed_data))
輸出:
原始值: (1, b'ab', 2.7)
格式符: b'I 2s f'
占用字節(jié): 12
打包結(jié)果: b'0100000061620000cdcc2c40'
這個示例將打包的值轉(zhuǎn)換為十六進(jìn)制字節(jié)序列,用binascii.hexlify()方法打印出來。
使用unpack()方法解包。
import struct import binascii packed_data = binascii.unhexlify(b'0100000061620000cdcc2c40') s = struct.Struct('I 2s f') unpacked_data = s.unpack(packed_data) print('解包結(jié)果:', unpacked_data)
輸出:
解包結(jié)果: (1, b'ab', 2.700000047683716)
將打包的值傳給unpack(),基本上返回相同的值(浮點數(shù)會有差異)。
3. 字節(jié)順序/大小/對齊
默認(rèn)情況下,pack是使用本地C庫的字節(jié)順序來編碼的。格式化字符串的第一個字符可以用來表示填充數(shù)據(jù)的字節(jié)順序、大小和對齊方式,如下表所描述的:
Character | Byte order | Size | Alignment |
@ | 本地 | 本地 | 本地 |
= | 本地 | standard | none |
< | little-endian(小字節(jié)序) | standard | none |
> | big-endian(大字節(jié)序) | standard | none |
! | network (= big-endian) | standard | none |
如果格式符中沒有設(shè)置這些,那么默認(rèn)將使用 @。
本地字節(jié)順序是指字節(jié)順序是由當(dāng)前主機系統(tǒng)決定。比如:Intel x86和AMD64(x86-64)使用小字節(jié)序; Motorola 68000和 PowerPC G5使用大字節(jié)序。ARM和Intel安騰支持切換字節(jié)序??梢允褂胹ys.byteorder查看當(dāng)前系統(tǒng)的字節(jié)順序。
本地大小(Size)和對齊(Alignment)是由c編譯器的sizeof表達(dá)式確定的。它與本地字節(jié)順序?qū)?yīng)。
標(biāo)準(zhǔn)大小由格式符確定,下面會講各個格式的標(biāo)準(zhǔn)大小。
示例:
4. 格式符
格式符對照表如下:
5. 緩沖區(qū)
將數(shù)據(jù)打包成二進(jìn)制通常是用在對性能要求很高的場景。
在這類場景中可以通過避免為每個打包結(jié)構(gòu)分配新緩沖區(qū)的開銷來優(yōu)化。
pack_into()和unpack_from()方法支持直接寫入預(yù)先分配的緩沖區(qū)。
import array import binascii import ctypes import struct s = struct.Struct('I 2s f') values = (1, 'ab'.encode('utf-8'), 2.7) print('原始值:', values) print() print('使用ctypes模塊string buffer') b = ctypes.create_string_buffer(s.size) print('原始buffer :', binascii.hexlify(b.raw)) s.pack_into(b, 0, *values) print('打包結(jié)果寫入 :', binascii.hexlify(b.raw)) print('解包 :', s.unpack_from(b, 0)) print() print('使用array模塊') a = array.array('b', b'\0' * s.size) print('原始值 :', binascii.hexlify(a)) s.pack_into(a, 0, *values) print('打包寫入 :', binascii.hexlify(a)) print('解包 :', s.unpack_from(a, 0))
輸出:
原始值: (1, b'ab', 2.7)
使用ctypes模塊string buffer
原始buffer : b'000000000000000000000000'
打包結(jié)果寫入 : b'0100000061620000cdcc2c40'
解包 : (1, b'ab', 2.700000047683716)
使用array模塊
原始值 : b'000000000000000000000000'
打包寫入 : b'0100000061620000cdcc2c40'
解包 : (1, b'ab', 2.700000047683716)
到此這篇關(guān)于Python模塊學(xué)習(xí)之struct模塊詳解的文章就介紹到這了,更多相關(guān)Python的struct模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
大語言模型的開發(fā)利器langchainan安裝使用快速入門學(xué)習(xí)
這篇文章主要為大家介紹了大語言模型的開發(fā)利器langchain安裝使用快速入門學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07Python實現(xiàn)抓取網(wǎng)頁并且解析的實例
這篇文章主要介紹了Python實現(xiàn)抓取網(wǎng)頁并且解析的功能實例,主要以解析百度問答為例說明其原理與方法,需要的朋友可以參考下2014-09-09利用Python實現(xiàn)斐波那契數(shù)列的方法實例
這篇文章主要給大家介紹了關(guān)于如何利用Python實現(xiàn)斐波那契數(shù)列的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07python點擊鼠標(biāo)獲取坐標(biāo)(Graphics)
這篇文章主要為大家詳細(xì)介紹了python點擊鼠標(biāo)獲取坐標(biāo),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08使用Python腳本來控制Windows Azure的簡單教程
這篇文章主要介紹了使用Python腳本來控制Windows Azure的簡單教程,由于微軟官方提供了Python SDK,使得用戶自己用Python控制Azure成為了可能,需要的朋友可以參考下2015-04-04