• <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中二進(jìn)制數(shù)據(jù)處理模塊struct使用

            Python中二進(jìn)制數(shù)據(jù)處理模塊struct使用

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

            使用struct.unpack把字符串解包成整數(shù)類型,如下:
            >>> b =struct.unpack("I", str)
            >>> b
            (16909060,)
            在解包之后,返回一個(gè)元組類型(tuple)的數(shù)據(jù)。
            如果多個(gè)數(shù)據(jù)進(jìn)行打包,可以在格式中指定打包的數(shù)據(jù)類型,然后數(shù)據(jù)通過參數(shù)傳入:
            >>> a ="hello"
            >>> b ="world!"
            >>> c =2
            >>> d =45.123
            >>> str= struct.pack("5s6sif", a, b, c, d)
            等價(jià)于: struct.pack_into(“5s6sif”,str,  0, a, b, c, d)
            >>> str
            'helloworld!\x00\x02\x00\x00\x00\xf4}4B'
            解包多個(gè)數(shù)據(jù)可以這樣做:
            >>>parts = struct.unpack("5s6sif", str)
            等價(jià)于:  struct.unpack_from(“5s6sif”, str, 0)
            >>>parts
            ('hello','world!', 2, 45.12300109863281)
            從上可以看到浮點(diǎn)值在解包后與原來值不一樣,這是因?yàn)楦↑c(diǎn)數(shù)的精度問題導(dǎo)致的。
            struct模塊中二進(jìn)制格式化表示
            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




            最后一個(gè)可以用來表示指針類型,占4個(gè)字節(jié)(32位),8個(gè)字節(jié)(64位)。
            為了在與不同硬件結(jié)構(gòu)之間交換數(shù)據(jù),需要考慮字節(jié)序,如下:
            字符
            字節(jié)序
            大小和對(duì)齊
            @
            本機(jī)字節(jié)序
            本機(jī),本機(jī)4字節(jié)對(duì)齊
            =
            本機(jī)字節(jié)序
            標(biāo)準(zhǔn),按原字節(jié)數(shù)對(duì)齊

            小尾字節(jié)序
            標(biāo)準(zhǔn),按原字節(jié)數(shù)對(duì)齊

            大尾字節(jié)序
            標(biāo)準(zhǔn),按原字節(jié)對(duì)齊
            !
            網(wǎng)絡(luò)字節(jié)序(大尾)
            標(biāo)準(zhǔn),按原字節(jié)對(duì)齊

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

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

            <2012年2月>
            2930311234
            567891011
            12131415161718
            19202122232425
            26272829123
            45678910

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評(píng)論

            久久精品国产亚洲AV忘忧草18| 国内精品久久久久国产盗摄| 精品久久人人做人人爽综合| 国产成人无码久久久精品一| 国产69精品久久久久久人妻精品| 久久久久国产精品麻豆AR影院 | 国产99久久久国产精品~~牛 | 99精品国产在热久久无毒不卡| 亚洲精品乱码久久久久久按摩 | 亚洲精品美女久久777777| 日本五月天婷久久网站| 欧美久久一级内射wwwwww.| 久久免费高清视频| 国产2021久久精品| 亚洲国产成人精品无码久久久久久综合| 国产精品九九久久免费视频| 久久本道综合久久伊人| 狠狠色丁香久久婷婷综合图片| 99久久国产精品免费一区二区 | 亚洲va久久久久| 亚洲女久久久噜噜噜熟女| 久久久无码人妻精品无码| 久久香蕉国产线看观看99| 久久99精品国产麻豆不卡| 超级碰碰碰碰97久久久久| 久久99国产综合精品女同| 久久成人精品| 亚洲乱码精品久久久久..| 久久综合狠狠色综合伊人| 伊人久久亚洲综合影院| 日产精品久久久久久久性色| 久久综合中文字幕| 久久人妻少妇嫩草AV蜜桃| 久久亚洲国产欧洲精品一| 国产精品99久久久精品无码| A狠狠久久蜜臀婷色中文网| 久久久久亚洲av成人无码电影| 婷婷久久香蕉五月综合加勒比| 91久久精品国产91性色也| 亚洲色欲久久久久综合网| 婷婷综合久久中文字幕|