python-1:Number數字類型 之二 相關函數 int.from_bytes,int.to_bytes()


函數格式int.from_bytes(bytes, byteorder, *, signed=False)
簡單demo:
[python] view plain copy
  1. <code class="language-python">s1 = b'\xf1\xff'  
  2. print(int.from_bytes(s1, byteorder='big', signed=False))  
  3. print(int.from_bytes(s1, byteorder='little', signed=True))  
  4. </code>  

 

 
輸出:61951
          -15
參數解釋bytes是要轉換的十六進制;
byteorder:選'big'和'little',以上例為例,其中big代表正常順序,即f1ff。little反之,代表反序fff1;
signed:選True、Flase表示是否要區分二進制的正負數含義。即是否要對原二進制數進行原碼反碼補碼操作。
在分析demo的轉換原理前我們首先要知道原碼、補碼、反碼的知識:
原碼:為了表示負數.(改變開頭位數字表示正負,1為負,0為正)
          我們都知道1的二進制數為0001,那-1呢?為了表示負數,規定了如果開頭那個數字如果是1就代表負數,即-1的二進制
          數原碼為1001
反碼:為了處理負數.(將負數的原碼除了開頭位全部由0變1或者由1變0)
          我們都知道1+(-1)=0,但是二者的二進制數 0001+1001=1010,結果是-2,這不是我們想要的,所以出現了反碼
          反碼,顧名思義就是“反着來”,把0變成1,1變成0,反的是負數的原碼,即-1的反碼 1001 變成了1110。
          這時候1+(-1)-> 0001 +1110=1111,再將結果1111從反碼返回成原碼即1000(-0),就是我們希望得到的數0.
          注意:負數原碼最開頭表示數字正負的那個數字位 ”1“ 不需要進行反碼操作。
補碼:為了處理-0與+0同時存在問題. (對反碼進行+1操作,如果最高位/開頭位被”溢出“,則舍去)
          -0的原碼是1000,反碼是1111,如果+1,則它的補碼是10000,如果這是四位字長的二進制存放位,就要把1舍去
            ,即-0的補碼變成了0000,這是我們希望的不分正負的0的表示方式,解決了+0\-0同時存在問題。   
           相應的,當3+(-3)的時候,有 0011 + 1101(1100的補碼) =10000,舍去最高為1,即結果為0000,是我們希望的 
demo分析:f1轉換成二進制是1111 0001  ,ff 則為1111 1111
                   (1) 在第一行print中,我們參數選擇的是big正序,false不分正負符號,即:
                             直接轉換正序 f1ff 二進制:1111 0001 1111 1111 轉換為十進制:61951
                   (2)在第二行print中,我們參數選擇的是little反序,true代表區分正負符號,即:
                             首先轉換 f1ff 為反序 fff1 ,反序的二進制有:1111 1111 1111 0001
                             由於我們選擇了true,所以要區分二進制的正負數含義:
                             原碼1111 1111 1111 0001最高位(開頭位)是1,即此二進制數為負數。
                             再進行反碼操作,即有 1000 0000 0000 1110
                             再進行補碼操作,有1000 0000 0000 1111
                             由於最高位1(開頭位)不進行二進制轉換計算,所以我們將除了最高位1(表示負數)以外

                                 數字進行二進制轉換十進制操作,即000 0000 0000 1111的十進制為15,即最后結果為-15.                      

**************************************************************************************************************************************************************

 

1.int.from_bytes函數

 

  • 功能:res = int.from_bytes(x)的含義是把bytes類型的變量x,轉化為十進制整數,並存入res中。其中bytes類型是python3特有的類型。
  • 函數參數:int.from_bytes(bytes, byteorder, *, signed=False)。在IDLE或者命令行界面中使用help(int.from_bytes)命令可以查看具體介紹。bytes是輸入的變量;byteorder主要有兩種:'big'和'little';signed=True表示需要考慮符號位。
  • 舉例說明:int_s  = int.from_bytes(s, byteorder='little', signed=True),其中s='\xf1\xff',則輸出int_s=-15。分析一下過程,'\x'表示十六進制數,先把'f1'寫成二進制數:1111 0001,'ff'同上:1111 1111.由於s的高低位標志是'little',即'f1'是低位,'ff'是高位,所以正確的順序應該是'fff1',即11111111 1111 0001.又因為要考慮符號位,第一位是1,所以s是負數,要進行取反加一才是正確的十進制數(第一位符號位的1不變),可以得到10000000 00001111,寫成十進制,就是-15,也就是int_s的結果。上面的例子中,如果signed=False,則無符號位;若byteorder='big',則輸入s的左邊是高位,右邊是低位。
    1. >>> s1 = b'\xf1\xff'
    2. >>> print(int.from_bytes(s1, byteorder='little', signed=True))
    3. -15
    4. >>> print(int.from_bytes(s1, byteorder='big', signed=False))
    5. 61951
    6. >>> s2 = b'\xff\xf1'
    7. >>> print(int.from_bytes(s2, byteorder='little', signed=False))
    8. 61951

 

 

 

2.int.to_bytes函數

功能:是int.from_bytes的逆過程,把十進制整數,轉換為bytes類型的格式。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM