• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            Python中二進制數據處理模塊struct使用

            Python中二進制數據處理模塊struct使用

            Python中沒有二進制類型,但是可以使用string字符串類型來存儲二進制數據,然后使用struct模塊來對二進制數據進行處理。下面將詳細描述如何使用struct模塊來處理二進制數據。
            使用struct.pack把一個整數值打包成字符串,打開Python命令行,輸入:
            >>>import struct
            >>> a =0x01020304
            >>> str= struct.pack("I", a)
            >>>repr(str)
            "'\\x04\\x03\\x02\\x01'"
            此時,str為一個字符串,字符串中的內容與整數a的二進制存儲的內容相同。

            使用struct.unpack把字符串解包成整數類型,如下:
            >>> b =struct.unpack("I", str)
            >>> b
            (16909060,)
            在解包之后,返回一個元組類型(tuple)的數據。
            如果多個數據進行打包,可以在格式中指定打包的數據類型,然后數據通過參數傳入:
            >>> a ="hello"
            >>> b ="world!"
            >>> c =2
            >>> d =45.123
            >>> str= struct.pack("5s6sif", a, b, c, d)
            等價于: struct.pack_into(“5s6sif”,str,  0, a, b, c, d)
            >>> str
            'helloworld!\x00\x02\x00\x00\x00\xf4}4B'
            解包多個數據可以這樣做:
            >>>parts = struct.unpack("5s6sif", str)
            等價于:  struct.unpack_from(“5s6sif”, str, 0)
            >>>parts
            ('hello','world!', 2, 45.12300109863281)
            從上可以看到浮點值在解包后與原來值不一樣,這是因為浮點數的精度問題導致的。
            struct模塊中二進制格式化表示
            Format C Type Python type Standard size 
            x pad byte no value     
            c char string of length 1
            b signed char integer 1   
            B unsigned char integer 1   
            ? _Bool bool 1 (1) 
            h short integer 2   
            H unsigned short integer 2   
            i int integer 4   
            I unsigned int integer 4   
            l long integer 4   
            L unsigned long integer 4   
            q long long integer 8 (2) 
            Q unsigned long long integer 8 (2) 
            f float float 4 (3) 
            d double float 8 (3) 
            s char[] string     
            p char[] string     
            P void * integer




            最后一個可以用來表示指針類型,占4個字節(32位),8個字節(64位)。
            為了在與不同硬件結構之間交換數據,需要考慮字節序,如下:
            字符
            字節序
            大小和對齊
            @
            本機字節序
            本機,本機4字節對齊
            =
            本機字節序
            標準,按原字節數對齊

            小尾字節序
            標準,按原字節數對齊

            大尾字節序
            標準,按原字節對齊
            !
            網絡字節序(大尾)
            標準,按原字節對齊

            注:缺省的情況下,使用本機字節序(同@),可以通過上面的字符修改字節序。
            計算格式字符串的大小函數:struct.calcsize(fmt)
            >>>struct.calcsize("ihi")                       缺省為4字節對齊時,長度為12
            12
            >>>struct.calcsize("iih")                       當h在最后的時(此時不4字節對齊),長度為10
            10
            >>>struct.calcsize("@ihi")
            12
            >>>struct.calcsize("=ihi")
            10
            >>>struct.calcsize(">ihi")
            10
            >>>struct.calcsize("<ihi")
            10
            >>>struct.calcsize("!ihi")
            10
            注:二進制文件打開/讀取的時候需要使用“rb”/“wb”模式以二進制方式打開/讀取文件。
            注:關于LE(little-endian)和BE(big-endian)區別:
            LE—最符合人的思維的字節序,地址低位存儲值的低位,地址高位存儲值的高位。
            BE—最直觀的字節序,地址低位存儲值的高位,地址高位存儲值的低位。
            例如:雙字0X01020304在內存中存儲方式,LE=0403 02 01,BE=01 02 03 04。

            posted on 2013-03-24 18:27 天下 閱讀(2764) 評論(0)  編輯 收藏 引用 所屬分類: Python

            <2011年11月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            国产精品18久久久久久vr| 精品久久久久久国产牛牛app| 久久精品国产乱子伦| 久久久久无码精品国产| 99久久综合狠狠综合久久| 国产精品久久久久蜜芽| 久久国产精品久久国产精品| 热RE99久久精品国产66热| 无码国产69精品久久久久网站| 久久不见久久见免费影院www日本| 亚洲av伊人久久综合密臀性色| 国内精品久久久久久久久| 久久久久人妻一区精品色| 中文字幕久久亚洲一区| 久久中文娱乐网| 99久久99这里只有免费的精品| 性高湖久久久久久久久AAAAA| 久久精品国产一区| 久久国产精品成人影院| 久久久久久亚洲精品影院| 久久国产成人| 91精品免费久久久久久久久| 国产精品久久久久国产A级| 国产亚洲美女精品久久久2020| 久久高潮一级毛片免费| 99国内精品久久久久久久| 久久精品中文无码资源站| 国产成人久久精品一区二区三区| 久久国产福利免费| 国产精品伊人久久伊人电影| 日韩一区二区久久久久久 | 国产亚洲欧美成人久久片| 久久综合给合久久国产免费| 久久人人爽人人人人片av| 99久久综合国产精品免费| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 91精品国产综合久久四虎久久无码一级| 亚洲中文久久精品无码| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 欧美伊香蕉久久综合类网站| 久久国产精品久久精品国产|