Python中struct模組對位元組流/二進位流的操作教程

來源:互聯網
上載者:User
最近在學習python網路編程這一塊,在寫簡單的socket通訊代碼時,遇到了struct這個模組的使用,當時不太清楚這到底有和作用,後來查閱了相關資料大概瞭解了,這篇文章就主要介紹了Python中struct模組對位元組流/二進位流的操作,需要的朋友可以參考借鑒。

前言

最近使用Python解析IDX檔案格式的MNIST資料集,需要對二進位檔案進行讀取操作,其中我使用的是struct模組。查了網上挺多教程都寫的挺好的,不過對新手不是很友好,所以我重新整理了一些筆記以供快速上手。

註:教程中以下四個名詞同義:二進位流、位元組、位元組流、位元組數組

快速上手

在struct模組中,將一個整型數字、浮點型數字或字元流(字元數組)轉換為位元組流(位元組數組)時,需要使用格式化字串fmt告訴struct模組被轉換的對象是什麼類型,比如整型數字是'i',浮點型數字是'f',一個ascii碼字元是's'。

def demo1(): # 使用bin_buf = struct.pack(fmt, buf)將buf為位元組bin_buf # 使用buf = struct.unpack(fmt, bin_buf)將bin_buf位元組反轉換回buf # 整型數 -> 二進位流 buf1 = 256 bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer' ret1 = struct.unpack('i', bin_buf1) print bin_buf1, ' <====> ', ret1 # 浮點數 -> 二進位流 buf2 = 3.1415 bin_buf2 = struct.pack('d', buf2) # 'd'代表'double' ret2 = struct.unpack('d', bin_buf2) print bin_buf2, ' <====> ', ret2 # 字串 -> 二進位流 buf3 = 'Hello World' bin_buf3 = struct.pack('11s', buf3) # '11s'代表長度為11的'string'字元數組 ret3 = struct.unpack('11s', bin_buf3) print bin_buf3, ' <====> ', ret3 # 結構體 -> 二進位流 # 假設有一個結構體 # struct header { # int buf1; # double buf2; # char buf3[11]; # } bin_buf_all = struct.pack('id11s', buf1, buf2, buf3) ret_all = struct.unpack('id11s', bin_buf_all) print bin_buf_all, ' <====> ', ret_all

輸出結果如下:


demo1輸出結果

詳解struct模組

主要函數

struct模組中最重要的三個函數是pack() , unpack() , calcsize()

# 按照給定的格式化字串,把資料封裝成字串(實際上是類似於c結構體的位元組流)string = struct.pack(fmt, v1, v2, ...)# 按照給定的格式(fmt)解析位元組流string,返回解析出來的tupletuple = unpack(fmt, string)# 計算給定的格式(fmt)佔用多少位元組的記憶體offset = calcsize(fmt)

struct中的格式化字串

struct中支援的格式如下表:


Format C Type Python 位元組數
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I unsigned int integer or lon 4
l long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void * long  

注1:q和Q只在機器支援64位操作時有意思

注2:每個格式前可以有一個數字,表示個數

注3:s格式表示一定長度的字串,4s表示長度為4的字串,但是p表示的是pascal字串

注4:P用來轉換一個指標,其長度和機器字長相關

注5:最後一個可以用來表示指標類型的,佔4個位元組

為了同c中的結構體交換資料,還要考慮有的c或c++編譯器使用了位元組對齊,通常是以4個位元組為單位的32位系統,故而struct根據本地機器位元組順序轉換.可以用格式中的第一個字元來改變對齊.定義如下:


Character Byte order Size and alignment
@ native native 湊夠4個位元組
= native standard 按原位元組數
< little-endian standard 按原位元組數
> big-endian standard 按原位元組數
! network (= big-endian) standard 按原位元組數

使用方法是放在fmt的第一個位置,就像'@5s6sif'

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.