程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python進制間的轉換

編輯:Python

最近在做計算機網絡課的一個課程項目,要在應用層實現可靠數據傳輸,即傳輸層用UDP不可靠信道。因為涉及到了字節流的傳輸,所以不可避免地要用到進制的轉換,在查找了各處的資料之後,總結了以下方法。 以下代碼都在命令行窗口測試過。

直接轉換

使用bin,oct,hex可將其他進制的數分別轉換為二進制、八進制、十六進制。

>>> a = 50
>>> bin(a)
'0b110010'
>>> oct(a)
'0o62'
>>> hex(a)
'0x32'
>>> bin(a)[2:]
'110010'

使用int

使用int()可以將任意進制的數轉換為十進制。

>>> int('50', 10)
50
>>> int('0b110010', 2)
50
>>> int('0o62', 8)
50
>>> int('0x32', 16)
50
>>> int('110010', 2) # 可以不用有0b前綴
50
>>> int('50', 9) # 任何進制都能轉換,比如9
45

使用format

>>> format(a, 'd')
'50'
>>> format(a, 'b')
'110010'
>>> format(a, 'o')
'62'
>>> format(a, 'x')
'32'
>>> "{0:d}".format(50)
'50'
>>> "{0:b}".format(50)
'110010'
>>> "{0:o}".format(50)
'62'
>>> "{0:x}".format(50)
'32'
>>> "{0:08b}".format(50) # 指定寬度為8,不足的在前面補0
'00110010'

關於format有疑問的可參考:Python format 格式化函數

轉化為bytes

以上的方法雖然看起來都實現了進制間的轉換,但其實都是數字和字符串之間的轉換,其內存空間也相應改變了。而要使數據能在網絡傳播,就把數據轉為數據字節流,即bytes。

>>> a = 50
>>> a.bit_length() # 查看數字占用的位長度
6
# a=50,對應二進制為110010,兩個字節為‘00000000 00110010’,ascii編碼中 50 對應的字符為 2
>>> a.to_bytes(2, byteorder='little') # 轉為2字節的bytes, 低位在前面
b'2\x00' # b‘\x00’表示 0x00 即 0b00000000,'2' 是 ascii編碼中 50 對應的字符
>>> a.to_bytes(2, byteorder='big') # 轉為2字節的bytes, 高位在前面
b'\x002'
>>> b = -50
>>> b.to_bytes(2, byteorder='little',signed=True) # 有符號數
b'\xce\xff'
>>> b'\x002'[1] # 獲取第1個字節即 b‘2’
50 # 輸出其utf-8編碼(這裡與ASCII編碼相同,因為‘2’可用ASCII編碼表示,ASCII編碼可看成utf-8編碼的一部分)
>>> b'\x002'[0] # 獲取第0個字節即 b‘\x00’
0
>>> int.from_bytes(b'\x002', byteorder='big')
50

對bytes有疑問的可參考:字符串和編碼


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved