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

首頁 > 編程 > Python > 正文

Python中struct模塊對字節流/二進制流的操作教程

2019-11-25 16:23:22
字體:
來源:轉載
供稿:網友

前言

最近使用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'

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助如果有疑問大家可以留言交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 合阳县| 玛纳斯县| 右玉县| 连州市| 巴林左旗| 苍梧县| 武邑县| 读书| 平和县| 和静县| 盘锦市| 华蓥市| 泸西县| 漳州市| 上杭县| 垣曲县| 精河县| 思南县| 洞口县| 永城市| 南部县| 扎兰屯市| 铜川市| 交城县| 高州市| 汽车| 德江县| 章丘市| 新津县| 武宣县| 新龙县| 南澳县| 皮山县| 民乐县| 祥云县| 禹城市| 黔南| 平乐县| 沾化县| 错那县| 沈丘县|