<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        Python中pack和unpack用法介紹

        來源:懂視網 責編:小采 時間:2020-11-27 14:23:01
        文檔

        Python中pack和unpack用法介紹

        Python中pack和unpack用法介紹:有的時候需要用python處理二進制數據,比如,存取文件,socket操作時.這時候,可以使用python的struct模塊來完成.可以用 struct來處理c語言中的結構體. struct模塊中最重要的三個函數是pack(), unpack(), calcsize()pack(fmt, v1
        推薦度:
        導讀Python中pack和unpack用法介紹:有的時候需要用python處理二進制數據,比如,存取文件,socket操作時.這時候,可以使用python的struct模塊來完成.可以用 struct來處理c語言中的結構體. struct模塊中最重要的三個函數是pack(), unpack(), calcsize()pack(fmt, v1

        有的時候需要用python處理二進制數據,比如,存取文件,socket操作時.這時候,可以使用python的struct模塊來完成.可以用 struct來處理c語言中的結構體.

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

        pack(fmt, v1, v2, ...) 按照給定的格式(fmt),把數據封裝成字符串(實際上是類似于c結構體的字節流)

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

        calcsize(fmt) 計算給定的格式(fmt)占用多少字節的內存

        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 long 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’

        例子1:

        結構體如下:

        struct Header
        {
         unsigned short id;
         char[4] tag;
         unsigned int version;
         unsigned int count;
        }

        通過socket.recv接收到了一個上面的結構體數據,存在字符串s中,現在需要把它解析出來,可以使用unpack()函數:

        import struct
        id, tag, version, count = struct.unpack("!H4s2I", s)

        上面的格式字符串中,!表示我們要使用網絡字節順序解析,因為我們的數據是從網絡中接收到的,在網絡上傳送的時候它是網絡字節順序的.后面的H表示 一個unsigned short的id,4s表示4字節長的字符串,2I表示有兩個unsigned int類型的數據.

        就通過一個unpack,現在id, tag, version, count里已經保存好我們的信息了.

        同樣,也可以很方便的把本地數據再pack成struct格式:

        ss = struct.pack("!H4s2I", id, tag, version, count);

        pack函數就把id, tag, version, count按照指定的格式轉換成了結構體Header,ss現在是一個字符串(實際上是類似于c結構體的字節流),可以通過 socket.send(ss)把這個字符串發送出去。

        例子2:

        import struct
        a=12.34
        #將a變為二進制
        bytes=struct.pack('i',a)

        此時bytes就是一個string字符串,字符串按字節同a的二進制存儲內容相同。

        再進行反操作,現有二進制數據bytes,(其實就是字符串),將它反過來轉換成python的數據類型:

        #注意,unpack返回的是tuple !!

        a,=struct.unpack('i',bytes)

        如果是由多個數據構成的,可以這樣:

        a='hello'
        b='world!'
        c=2
        d=45.123
        bytes=struct.pack('5s6sif',a,b,c,d)

        此時的bytes就是二進制形式的數據了,可以直接寫入文件比如 binfile.write(bytes)

        然后,當我們需要時可以再讀出來,bytes=binfile.read()

        再通過struct.unpack()解碼成python變量:

        a,b,c,d=struct.unpack('5s6sif',bytes)

        ’5s6sif’這個叫做fmt,就是格式化字符串,由數字加字符構成,5s表示占5個字符的字符串,2i,表示2個整數等等,下面是可用的字符及類型,ctype表示可以與python中的類型一一對應。

        注意:二進制文件處理時會碰到的問題

        我們使用處理二進制文件時,需要用如下方法:

        binfile=open(filepath,'rb') 
        #讀二進制文件
        binfile=open(filepath,'wb') 
        #寫二進制文件

        那么和binfile=open(filepath,’r')的結果到底有何不同呢?

        不同之處有兩個地方:

        第一,使用’r'的時候如果碰到’0x1A’,就會視為文件結束,這就是EOF。使用’rb’則不存在這個問題。即,如果你用二進制寫入再用文本讀出的話,如果其中存在’0X1A’,就只會讀出文件的一部分。使用’rb’的時候會一直讀到文件末尾。

        第二,對于字符串x=’abc def’,我們可用len(x)得到它的長度為7, 我們稱之為換行符,實際上是’0X0A’。當我們用’w'即文本方式寫的時候,在windows平臺上會自動將’0X0A’變成兩個字符’0X0D’,’0X0A’,即文件長度實際上變成8.。當用’r'文本方式讀取時,又自動的轉換成原來的換行符。如果換成’wb’二進制方式來寫的話,則會保持一個字符不變,讀取時也是原樣讀取。所以如果用文本方式寫入,用二進制方式讀取的話,就要考慮這多出的一個字節了。’0X0D’又稱回車符。linux下不會變。因為linux只使用’0X0A’來表示換行。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        Python中pack和unpack用法介紹

        Python中pack和unpack用法介紹:有的時候需要用python處理二進制數據,比如,存取文件,socket操作時.這時候,可以使用python的struct模塊來完成.可以用 struct來處理c語言中的結構體. struct模塊中最重要的三個函數是pack(), unpack(), calcsize()pack(fmt, v1
        推薦度:
        標簽: 使用 用法 python
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲图片在线观看| 亚洲国产成人五月综合网| 亚洲国产综合91精品麻豆| 国精产品一区一区三区免费视频| 国产L精品国产亚洲区久久| sss在线观看免费高清| 在线亚洲人成电影网站色www | 1区1区3区4区产品亚洲| 最近免费2019中文字幕大全| 亚洲美女视频免费| 黄页网站免费观看| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲精品高清视频| 国产在线观看麻豆91精品免费 | 精品国产_亚洲人成在线高清| 亚洲电影免费在线观看| 亚洲H在线播放在线观看H| 国产网站在线免费观看| 巨胸喷奶水www永久免费| 亚洲精品一区二区三区四区乱码| 青青草a免费线观a| 女人裸身j部免费视频无遮挡| 国产成人无码综合亚洲日韩| 免费精品国偷自产在线在线| 337p日本欧洲亚洲大胆人人| 亚洲理论电影在线观看| 无码乱肉视频免费大全合集| 色五月五月丁香亚洲综合网| 亚洲国产精品无码专区| 欧美男同gv免费网站观看 | 亚洲日本久久久午夜精品| 亚洲欧洲中文日韩久久AV乱码 | 精品国产精品久久一区免费式| fc2成年免费共享视频18| 亚洲综合激情九月婷婷 | 国产日韩亚洲大尺度高清| 无码中文在线二区免费| 一个人晚上在线观看的免费视频| 中文字幕亚洲精品| 亚洲精品高清在线| 老司机在线免费视频|