<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # struct 準確地講,Python沒有專門處理字節的數據類型。但由于`str`既是字符串,又可以表示字節,所以,字節數組=str。而在C語言中,我們可以很方便地用struct、union來處理字節,以及字節和int,float的轉換。 在Python中,比方說要把一個32位無符號整數變成字節,也就是4個長度的str,你得配合位運算符這么寫: ``` >>> n = 10240099 >>> b1 = chr((n & 0xff000000) >> 24) >>> b2 = chr((n & 0xff0000) >> 16) >>> b3 = chr((n & 0xff00) >> 8) >>> b4 = chr(n & 0xff) >>> s = b1 + b2 + b3 + b4 >>> s '\x00\x9c@c' ``` 非常麻煩。如果換成浮點數就無能為力了。 好在Python提供了一個`struct`模塊來解決`str`和其他二進制數據類型的轉換。 `struct`的`pack`函數把任意數據類型變成字符串: ``` >>> import struct >>> struct.pack('>I', 10240099) '\x00\x9c@c' ``` `pack`的第一個參數是處理指令,`'&gt;I'`的意思是: `&gt;`表示字節順序是big-endian,也就是網絡序,`I`表示4字節無符號整數。 后面的參數個數要和處理指令一致。 `unpack`把`str`變成相應的數據類型: ``` >>> struct.unpack('>IH', '\xf0\xf0\xf0\xf0\x80\x80') (4042322160, 32896) ``` 根據`&gt;IH`的說明,后面的`str`依次變為`I`:4字節無符號整數和`H`:2字節無符號整數。 所以,盡管Python不適合編寫底層操作字節流的代碼,但在對性能要求不高的地方,利用`struct`就方便多了。 `struct`模塊定義的數據類型可以參考Python官方文檔: [https://docs.python.org/2/library/struct.html#format-characters](https://docs.python.org/2/library/struct.html#format-characters) Windows的位圖文件(.bmp)是一種非常簡單的文件格式,我們來用`struct`分析一下。 首先找一個bmp文件,沒有的話用“畫圖”畫一個。 讀入前30個字節來分析: ``` >>> s = '\x42\x4d\x38\x8c\x0a\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00\x80\x02\x00\x00\x68\x01\x00\x00\x01\x00\x18\x00' ``` BMP格式采用小端方式存儲數據,文件頭的結構按順序如下: 兩個字節:`'BM'`表示Windows位圖,`'BA'`表示OS/2位圖; 一個4字節整數:表示位圖大小; 一個4字節整數:保留位,始終為0; 一個4字節整數:實際圖像的偏移量; 一個4字節整數:Header的字節數; 一個4字節整數:圖像寬度; 一個4字節整數:圖像高度; 一個2字節整數:始終為1; 一個2字節整數:顏色數。 所以,組合起來用`unpack`讀取: ``` >>> struct.unpack('<ccIIIIIIHH', s) ('B', 'M', 691256, 0, 54, 40, 640, 360, 1, 24) ``` 結果顯示,`'B'`、`'M'`說明是Windows位圖,位圖大小為640x360,顏色數為24。 請編寫一個`bmpinfo.py`,可以檢查任意文件是否是位圖文件,如果是,打印出圖片大小和顏色數。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看