Python使用struct庫(kù)的用法小結(jié)
struct簡(jiǎn)介
看到struct這么英文單詞,大家應(yīng)該并不陌生,因?yàn)閏/c++中就有struct,在那里struct叫做結(jié)構(gòu)體。在Python中也使用struct,這充分說明了這個(gè)struct應(yīng)該和c/c++中的struct有很深的淵源。Python正是使用struct模塊執(zhí)行Python值和C結(jié)構(gòu)體之間的轉(zhuǎn)換,從而形成Python字節(jié)對(duì)象。它使用格式字符串作為底層C結(jié)構(gòu)體的緊湊描述,進(jìn)而根據(jù)這個(gè)格式字符串轉(zhuǎn)換成Python值。
準(zhǔn)確地講,Python沒有專門處理字節(jié)的數(shù)據(jù)類型。但由于
b'str'
可以表示字節(jié),所以,字節(jié)數(shù)組=二進(jìn)制str。而在C語言中,我們可以很方便地用struct、union來處理字節(jié),以及字節(jié)和int,float的轉(zhuǎn)換。故提供一個(gè)庫(kù)來做轉(zhuǎn)換。
常用函數(shù)
struct.pack(format:str, v1, v2, …)
按format的格式打包v1、v2等參數(shù)
import struct result = [1,2,3,4,5] print([struct.pack('<B', x) for x in result]) # [b'\x01', b'\x02', b'\x03', b'\x04', b'\x05']
struct.unpack(format:str,buffer:bytes)
按format的格式解包buffer數(shù)據(jù),注意結(jié)果是一個(gè)數(shù)組
import struct result = bytes.fromhex('10002030000000') print(struct.unpack('<BHI', result)) # (16, 8192, 48)
上代碼是按小端序列進(jìn)行解析的
10被解析成了16
0020被解析成了 0x00 + 0x20 * 256 = 32*256 = 8192
30000000被解析成了 0x30 + 0x0 * 256 + 0x0 * 16³ + 0x0 * 256² = 48
struct.calcsize(format:str)
按format的格式計(jì)算這個(gè)格式本應(yīng)該的大小
import struct print(struct.calcsize('<BHI')) # 7
B是1個(gè)字節(jié),H是2個(gè)字節(jié),I是4個(gè)字節(jié),共7個(gè)字節(jié)
format參數(shù)的用法
數(shù)據(jù)
Format | C Type | Python | 字節(jié)數(shù) |
---|---|---|---|
x | pad byte | None | 1 |
c | char | int | 1 |
b | signed char | int | 1 |
B | unsigned char | int | 1 |
? | Bool | bool | 1 |
h | short | int | 2 |
H | unsigned short | int | 2 |
i | int | int | 4 |
I | unsigned int | int | 4 |
l | long | int | 4 |
L | unsigned long | int | 4 |
q | long long | int | 8 |
Q | unsigned long long | int | 8 |
f | float | float | 4 |
d | double | float | 8 |
s | char[] | bytes | 1 |
p | char[] | bytes | 1 |
P | void * | int | 0 |
描述符
Character | Byte order | Size | alignment |
---|---|---|---|
@ | native | native | 湊足4個(gè)字節(jié) |
= | native | standard | 不作變化 |
< | little-endian | standard | 不作變化 |
> | big-endian | standard | 不作變化 |
! | network (= big-endian) | standard | 不作變化 |
到此這篇關(guān)于Python使用struct庫(kù)的用法小結(jié)的文章就介紹到這了,更多相關(guān)Python使用struct庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)在不同坐標(biāo)系中繪制曲線
這篇文章主要為大家學(xué)習(xí)介紹了Python如何實(shí)現(xiàn)在不同坐標(biāo)系中繪制曲線,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-07-07Python語音識(shí)別API實(shí)現(xiàn)文字轉(zhuǎn)語音的幾種方法
本文主要介紹了Python語音識(shí)別API實(shí)現(xiàn)文字轉(zhuǎn)語音的幾種方法,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Python?Fuzzywuzzy庫(kù)基本函數(shù)及模糊字符串匹配應(yīng)用實(shí)戰(zhàn)
fuzzywuzzy?是一個(gè)用于模糊字符串匹配的?Python?庫(kù),它基于編輯距離算法,提供了多個(gè)函數(shù)來比較字符串之間的相似性,在實(shí)際開發(fā)中,字符串匹配是一項(xiàng)常見但具有挑戰(zhàn)性的任務(wù),用戶可能犯拼寫錯(cuò)誤,使用縮寫或者輸入同義詞,因此,我們需要一種方法來處理這些情況2023-12-12python模擬實(shí)現(xiàn)斗地主發(fā)牌
這篇文章主要為大家詳細(xì)介紹了python代碼模擬實(shí)現(xiàn)斗地主發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01python?ConfigParser庫(kù)的使用及遇到的坑
這篇文章主要介紹了python?ConfigParser庫(kù)的使用及遇到的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Python中的魔術(shù)方法Magic?Methods使用實(shí)例全面指南
在Python中,魔術(shù)方法Magic?Methods是一種特殊的方法,它們以雙下劃線開頭和結(jié)尾,如__init__、__str__等,這些方法允許定制類的行為,使得對(duì)象更具有靈活性和可定制性,本文將深入探討Python中一些常用的魔術(shù)方法,以及如何使用它們來定制類與對(duì)象2024-01-01