激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python中struct模塊對字節流/二進制流的操作教程

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

2020-09-18 10:54monitor1379 Python

最近在學習python網絡編程這一塊,在寫簡單的socket通信代碼時,遇到了struct這個模塊的使用,當時不太清楚這到底有和作用,后來查閱了相關資料大概了解了,這篇文章就主要介紹了Python中struct模塊對字節流/二進制流的操作,需要的

前言

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

注:教程中以下四個名詞同義:二進制流、二進制數組、字節流、字節數組

快速上手

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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

輸出結果如下:

Python中struct模塊對字節流/二進制流的操作教程
demo1輸出結果

詳解struct模塊

主要函數

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

?
1
2
3
4
5
6
7
8
# 按照給定的格式化字符串,把數據封裝成字符串(實際上是類似于c結構體的字節流)
string = struct.pack(fmt, v1, v2, ...)
 
# 按照給定的格式(fmt)解析字節流string,返回解析出來的tuple
tuple = 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'

總結

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

原文鏈接:http://www.jianshu.com/p/5a985f29fa81

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美国产日韩在线观看成人 | 在线看成人av | 九九热九九 | 国产精品久久久久永久免费 | 欧美一级毛片欧美一级成人毛片 | 国产一区二区免费 | 国产精品6区 | 69性欧美高清影院 | ,欧美特黄特色三级视频在线观看 | 久久免费观看一级毛片 | 久草在线手机视频 | 欧美高清第一页 | 91精品国产91 | av一二三四区 | 日日噜噜噜噜久久久精品毛片 | 亚洲成人中文字幕在线 | 一区二区三区小视频 | 草莓视频在线导航 | 草逼一区| 他也色在线视频 | 国产成人综合在线 | 亚洲欧美日韩综合 | 中文字幕激情视频 | 精精国产xxxx视频在线播放7 | 国产精品99免费视频 | 天天草天天操 | china对白普通话xxxx | 欧美成人精品一区二区男人小说 | 黄色网在线播放 | 88xx成人永久免费观看 | 激情小视频在线观看 | 免费视频www在线观看 | 亚洲射吧| 青青草成人免费视频在线 | 欧美高清另类自拍视频在线看 | 日日狠狠久久 | 麻豆一二区 | 天天操天天插天天干 | 国产一区二区三区四区精 | 国产一级毛片av | 日本在线视频免费观看 |