最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中struct模塊對字節(jié)流/二進(jìn)制流的操作教程

 更新時間:2017年01月21日 14:25:29   作者:monitor1379  
最近在學(xué)習(xí)python網(wǎng)絡(luò)編程這一塊,在寫簡單的socket通信代碼時,遇到了struct這個模塊的使用,當(dāng)時不太清楚這到底有和作用,后來查閱了相關(guān)資料大概了解了,這篇文章就主要介紹了Python中struct模塊對字節(jié)流/二進(jìn)制流的操作,需要的朋友可以參考借鑒。

前言

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

注:教程中以下四個名詞同義:二進(jìn)制流、二進(jìn)制數(shù)組、字節(jié)流、字節(jié)數(shù)組

快速上手

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

def demo1():
 # 使用bin_buf = struct.pack(fmt, buf)將buf為二進(jìn)制數(shù)組bin_buf
 # 使用buf = struct.unpack(fmt, bin_buf)將bin_buf二進(jìn)制數(shù)組反轉(zhuǎn)換回buf

 # 整型數(shù) -> 二進(jìn)制流
 buf1 = 256
 bin_buf1 = struct.pack('i', buf1) # 'i'代表'integer'
 ret1 = struct.unpack('i', bin_buf1)
 print bin_buf1, ' <====> ', ret1

 # 浮點數(shù) -> 二進(jìn)制流
 buf2 = 3.1415
 bin_buf2 = struct.pack('d', buf2) # 'd'代表'double'
 ret2 = struct.unpack('d', bin_buf2)
 print bin_buf2, ' <====> ', ret2

 # 字符串 -> 二進(jìn)制流
 buf3 = 'Hello World'
 bin_buf3 = struct.pack('11s', buf3) # '11s'代表長度為11的'string'字符數(shù)組
 ret3 = struct.unpack('11s', bin_buf3)
 print bin_buf3, ' <====> ', ret3

 # 結(jié)構(gòu)體 -> 二進(jìn)制流
 # 假設(shè)有一個結(jié)構(gòu)體
 # 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

輸出結(jié)果如下:


demo1輸出結(jié)果

詳解struct模塊

主要函數(shù)

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

# 按照給定的格式化字符串,把數(shù)據(jù)封裝成字符串(實際上是類似于c結(jié)構(gòu)體的字節(jié)流)
string = struct.pack(fmt, v1, v2, ...)

# 按照給定的格式(fmt)解析字節(jié)流string,返回解析出來的tuple
tuple = unpack(fmt, string)

# 計算給定的格式(fmt)占用多少字節(jié)的內(nèi)存
offset = calcsize(fmt)

struct中的格式化字符串

struct中支持的格式如下表:

Format C Type Python 字節(jié)數(shù)
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只在機(jī)器支持64位操作時有意思

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

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

      注4:P用來轉(zhuǎn)換一個指針,其長度和機(jī)器字長相關(guān)

      注5:最后一個可以用來表示指針類型的,占4個字節(jié)

為了同c中的結(jié)構(gòu)體交換數(shù)據(jù),還要考慮有的c或c++編譯器使用了字節(jié)對齊,通常是以4個字節(jié)為單位的32位系統(tǒng),故而struct根據(jù)本地機(jī)器字節(jié)順序轉(zhuǎn)換.可以用格式中的第一個字符來改變對齊方式.定義如下:

Character Byte order Size and alignment
@ native native 湊夠4個字節(jié)
= native standard 按原字節(jié)數(shù)
< little-endian standard 按原字節(jié)數(shù)
> big-endian standard 按原字節(jié)數(shù)
! network (= big-endian) standard 按原字節(jié)數(shù)

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

總結(jié)

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

相關(guān)文章

  • 基于Python+Tkinter實現(xiàn)一個簡易計算器

    基于Python+Tkinter實現(xiàn)一個簡易計算器

    Tkinter作為Python的標(biāo)準(zhǔn)庫,是非常流行的Python GUI工具,同時也是非常容易學(xué)習(xí)的。本文將利用Tkinter繪制一個簡單的計算器,感興趣的可以試一試
    2022-01-01
  • Python利用filestools模塊實現(xiàn)水印添加

    Python利用filestools模塊實現(xiàn)水印添加

    最近發(fā)現(xiàn)的這款filestools非標(biāo)準(zhǔn)庫其實真正實現(xiàn)添加水印的只要一個函數(shù)的調(diào)用,一行代碼即可完成水印的添加,感興趣的快跟隨小編一起學(xué)起來吧
    2022-09-09
  • 基于Python編寫一個監(jiān)控CPU的應(yīng)用系統(tǒng)

    基于Python編寫一個監(jiān)控CPU的應(yīng)用系統(tǒng)

    在使用電腦辦公時,有時候不知道哪些軟件或進(jìn)程會占用大量的資源,導(dǎo)致進(jìn)行其他任務(wù)時出現(xiàn)變慢、卡頓等現(xiàn)象。因此,實時監(jiān)控系統(tǒng)的資源就變得非常重要。本文用Python編寫了一款超治愈的RunCat監(jiān)控應(yīng)用系統(tǒng),需要的可以參考一下
    2022-06-06
  • Python?解釋器的站點配置和模塊搜索路徑詳解

    Python?解釋器的站點配置和模塊搜索路徑詳解

    Python?解釋器的站點配置是指一組配置和路徑設(shè)置,用于支持特定于站點的定制和擴(kuò)展,這些配置和路徑信息由?Python?的內(nèi)置?site?模塊提供,這篇文章主要介紹了Python?解釋器的站點配置和模塊搜索路徑詳解,需要的朋友可以參考下
    2022-01-01
  • python網(wǎng)絡(luò)爬蟲實現(xiàn)個性化音樂播放器示例解析

    python網(wǎng)絡(luò)爬蟲實現(xiàn)個性化音樂播放器示例解析

    這篇文章主要為大家介紹了使用python網(wǎng)絡(luò)爬蟲實現(xiàn)個性化音樂播放器的詳細(xì)示例代碼以及內(nèi)容解析,有需要的朋友?可以借鑒參考下希望能夠有所幫助
    2022-03-03
  • python高階函數(shù)functools模塊的具體使用

    python高階函數(shù)functools模塊的具體使用

    本文主要介紹了python高階函數(shù)functools模塊的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Python字符串匹配之6種方法的使用詳解

    Python字符串匹配之6種方法的使用詳解

    這篇文章主要介紹了Python字符串匹配之6種方法的使用詳解,在文末給大家提到了python正則表達(dá)的說明,感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2019-04-04
  • Python實現(xiàn)向QQ群成員自動發(fā)郵件的方法

    Python實現(xiàn)向QQ群成員自動發(fā)郵件的方法

    這篇文章主要介紹了Python實現(xiàn)向QQ群成員自動發(fā)郵件的方法,通過讀取txt文本里的QQ成員數(shù)據(jù)再調(diào)用發(fā)送郵件函數(shù)實現(xiàn)該功能,是非常實用的技巧,需要的朋友可以參考下
    2014-11-11
  • 使用keras框架cnn+ctc_loss識別不定長字符圖片操作

    使用keras框架cnn+ctc_loss識別不定長字符圖片操作

    這篇文章主要介紹了使用keras框架cnn+ctc_loss識別不定長字符圖片操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python實現(xiàn)機(jī)器學(xué)習(xí)之多元線性回歸

    python實現(xiàn)機(jī)器學(xué)習(xí)之多元線性回歸

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)機(jī)器學(xué)習(xí)之多元線性回歸,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09

最新評論

华池县| 枣庄市| 安泽县| 安达市| 雷州市| 顺昌县| 定襄县| 华容县| 政和县| 泉州市| 丹棱县| 赫章县| 金乡县| 濉溪县| 阜新| 蒙自县| 大安市| 河南省| 中阳县| 五寨县| 华安县| 琼中| 白山市| 临朐县| 东乡县| 六安市| 北辰区| 苍梧县| 静海县| 开封市| 三门县| 弋阳县| 琼海市| 北流市| 松江区| 大悟县| 岑巩县| 仁布县| 卫辉市| 沙湾县| 本溪市|