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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] ### 引入 準確地講,Python沒有專門處理字節的數據類型。但由于`b'str'`可以表示字節,所以,字節數組`=`二進制`str`。而在`C`語言中,我們可以很方便地用`struct`、`union`來處理字節,以及字節和`int`,`float`的轉換。 ### 無符號整數變字節數 在Python中,比方說要把一個`32`位無符號整數變成字節,也就是`4`個長度的`bytes`,你得配合位運算符這么寫: ~~~ >>> n = 10240099 >>> b1 = (n & 0xff000000) >> 24 >>> b2 = (n & 0xff0000) >> 16 >>> b3 = (n & 0xff00) >> 8 >>> b4 = n & 0xff >>> bs = bytes([b1, b2, b3, b4]) >>> bs b'\x00\x9c@c' ~~~ 非常麻煩。如果換成浮點數就無能為力了。 ### 使用 struct 模塊 好在Python提供了一個`struct`模塊來解決`bytes`和其他二進制數據類型的轉換。 `struct`的`pack`函數把任意數據類型變成`bytes`: ~~~ >>> import struct >>> struct.pack('>I', 10240099) b'\x00\x9c@c' ~~~ `pack`的第一個參數是處理指令,`'>I'`的意思是: `>`表示字節順序是`big-endian`,也就是網絡序,`I`表示4字節無符號整數。 后面的參數個數要和處理指令一致。 `unpack`把`bytes`變成相應的數據類型: ~~~ >>> struct.unpack('>IH', b'\xf0\xf0\xf0\xf0\x80\x80') (4042322160, 32896) ~~~ 根據`>IH`的說明,后面的`bytes`依次變為`I:4`字節無符號整數和`H:2`字節無符號整數。 所以,盡管Python不適合編寫底層操作字節流的代碼,但在對性能要求不高的地方,利用`struct`就方便多了。 `struct`模塊定義的數據類型可以參考Python官方文檔: https://docs.python.org/3/library/struct.html#format-characters `Windows`的位圖文件(`.bmp`)是一種非常簡單的文件格式,我們來用`struct`分析一下。 首先找一個`bmp`文件,沒有的話用“畫圖”畫一個。 讀入前`30`個字節來分析: `>>> s = b'\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'B', b'M', 691256, 0, 54, 40, 640, 360, 1, 24) ~~~ 結果顯示,`b'B'`、`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>

                              哎呀哎呀视频在线观看