函數格式:
int.from_bytes(bytes, byteorder, *, signed=False)
簡單demo:
- <code class="language-python">s1 = b'\xf1\xff'
- print(int.from_bytes(s1, byteorder='big', signed=False))
- print(int.from_bytes(s1, byteorder='little', signed=True))
- </code>
輸出:61951
-15
-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的左邊是高位,右邊是低位。
-
-
>>> s1 = b'\xf1\xff'
-
>>> print(int.from_bytes(s1, byteorder='little', signed=True))
-
-15
-
>>> print(int.from_bytes(s1, byteorder='big', signed=False))
-
61951
-
>>> s2 = b'\xff\xf1'
-
>>> print(int.from_bytes(s2, byteorder='little', signed=False))
-
61951
-
2.int.to_bytes函數
功能:是int.from_bytes的逆過程,把十進制整數,轉換為bytes類型的格式。