Python struct.unpack() 用法及常見錯誤詳解
struct.unpack()
是 Python 中用于將二進(jìn)制數(shù)據(jù)(字節(jié)序列)解析為 Python 數(shù)據(jù)類型的函數(shù),通常與 struct.pack()
配對使用。它根據(jù)指定的格式字符串(format string)解析字節(jié)流,并返回一個包含解析結(jié)果的元組。
一、函數(shù)語法
struct.unpack(format, buffer)
- format:格式字符串,定義數(shù)據(jù)的解析規(guī)則(字節(jié)順序、數(shù)據(jù)類型、數(shù)量等)。
- buffer:包含二進(jìn)制數(shù)據(jù)的緩沖區(qū)(如
bytes
、bytearray
或支持緩沖協(xié)議的對象)。
返回值:包含解析后數(shù)據(jù)的元組。
二、格式字符串詳解
格式字符串由兩部分組成:
字節(jié)順序/對齊字符(可選):
字符 | 含義 | 大小端 |
---|---|---|
@ | 本地順序(默認(rèn)) | 系統(tǒng)依賴 |
= | 本地標(biāo)準(zhǔn)大小 | 系統(tǒng)依賴 |
< | 小端(Little-Endian) | 低位在前 |
> | 大端(Big-Endian) | 高位在前 |
! | 網(wǎng)絡(luò)順序(大端) | RFC 標(biāo)準(zhǔn) |
數(shù)據(jù)類型字符(必選):
字符 | C 類型 | Python 類型 | 字節(jié)數(shù) |
---|---|---|---|
x | 填充字節(jié) | 跳過字節(jié) | 1 |
c | char | bytes (長度1) | 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 | 長度見下文 |
p | Pascal 字符串 | bytes | 1+長度 |
P | void* | int | 系統(tǒng)依賴 |
特殊用法:
特殊用法:
s
:需指定長度,如10s
表示解析 10 字節(jié)的字符串。- 數(shù)字前綴:
3I
表示連續(xù)解析 3 個無符號整數(shù)。
三、使用示例
示例 1:解析整數(shù)和浮點數(shù)
import struct # 二進(jìn)制數(shù)據(jù):小端順序 (<) + int (i) + float (f) buffer = b'\x01\x00\x00\x00\xcd\xcc\x8c@' data = struct.unpack('<if', buffer) # 解析1個int和1個float print(data) # 輸出: (1, 7.000000476837158)
示例 2:解析字符串
# 數(shù)據(jù):大端 (>) + 4字節(jié)字符串 (4s) buffer = b'ABCD' data = struct.unpack('>4s', buffer) print(data) # 輸出: (b'ABCD',)
示例 3:解析混合類型
# 數(shù)據(jù):小端 (<) + short (h) + 3字節(jié)字符串 (3s) + float (f) buffer = b'\x01\x00XYZ\x00\x00\x80?' data = struct.unpack('<h3sf', buffer) print(data) # 輸出: (1, b'XYZ', 1.0)
示例 4:跳過填充字節(jié)
# 格式: 小端 (<) + char (c) + 填充1字節(jié) (x) + int (i) buffer = b'A\x00\x02\x00\x00\x00' data = struct.unpack('<cx i', buffer) print(data) # 輸出: (b'A', 2)
示例 5:解析數(shù)組
# 解析3個連續(xù)的 unsigned short (H) buffer = b'\x01\x00\x02\x00\x03\x00' data = struct.unpack('<3H', buffer) print(data) # 輸出: (1, 2, 3)
四、關(guān)鍵注意事項
緩沖區(qū)長度必須匹配
使用 struct.calcsize(format)
驗證格式字符串所需的字節(jié)數(shù):
fmt = '<2i f' buffer = b'\x00' * struct.calcsize(fmt) # 創(chuàng)建匹配長度的緩沖區(qū)
字節(jié)順序至關(guān)重要
大端/小端錯誤會導(dǎo)致解析數(shù)值異常:
# 錯誤示例:大端數(shù)據(jù)用小端解析 buffer = b'\x00\x00\x00\x01' # 大端表示的整數(shù) 1 struct.unpack('<I', buffer) # 錯誤!解析為 16777216 (0x01000000)
字符串處理s
類型返回 bytes
對象,需用 .decode()
轉(zhuǎn)為字符串:
data = struct.unpack('5s', b'Hello')[0] print(data.decode('utf-8')) # 輸出: 'Hello'
內(nèi)存對齊問題
默認(rèn)格式 @
會按本地對齊方式插入填充字節(jié)。使用 =
或標(biāo)準(zhǔn)順序(<
/>
)避免對齊。
五、常見錯誤
struct.error: unpack requires a buffer of X bytes
緩沖區(qū)長度與格式字符串不匹配。
- 解析指針類型 (
P
)
結(jié)果依賴平臺(32/64位),通常應(yīng)避免使用。
通過合理設(shè)計格式字符串,struct.unpack()
可高效處理二進(jìn)制協(xié)議(如網(wǎng)絡(luò)數(shù)據(jù)、文件格式)。
到此這篇關(guān)于Python struct.unpack() 用法詳解的文章就介紹到這了,更多相關(guān)Python struct.unpack() 用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python制作游戲下載進(jìn)度條的代碼(程序說明見注釋)
這篇文章主要介紹了用python制作游戲下載進(jìn)度條的代碼(程序說明見注釋),代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-10-10python redis 批量設(shè)置過期key過程解析
這篇文章主要介紹了python redis 批量設(shè)置過期key過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11Python matplotlib 繪制雙Y軸曲線圖的示例代碼
Matplotlib是非常強(qiáng)大的python畫圖工具,這篇文章主要介紹了Python matplotlib 繪制雙Y軸曲線圖,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06python實現(xiàn)滑動拼圖驗證碼擺脫煩人的驗證碼輸入
這篇文章主要為大家介紹了python實現(xiàn)滑動拼圖驗證碼擺脫煩人的驗證碼輸入方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08在Linux系統(tǒng)上安裝Python的Scrapy框架的教程
這篇文章主要介紹了在Linux系統(tǒng)上安裝Python的Scrapy框架的教程,Scrapy是著名的專門針對搜索引擎的爬蟲制作而研發(fā)的Python框架,需要的朋友可以參考下2015-06-06淺談Python中的異常和JSON讀寫數(shù)據(jù)的實現(xiàn)
今天小編就為大家分享一篇淺談Python中的異常和JSON讀寫數(shù)據(jù)的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02