Python3各種進制之間的轉換方法


一、2/8/10/16進制互轉

1.1 2/8/10/16進制賦值

# 二進制賦值以0b打頭
a = 0b1000
# 八進制賦值以0o打頭,第一個是數字0第二個是字母o
b = 0o1100
# 十進制不需要特別標明
c = 1110
# 十六進制賦值以0x打頭
d = 0x1111

1.2 2/8/10/16進制互轉

其他進制轉二進制----bin(var)

其他進制轉八進制----oct(var)

其他進制轉十進制----int(var),其實不管賦值時用什么進制默認輸出都是十進制,所以可以不需要轉換

其他進制轉十進制----hex(var)

 

二、數值和字符串互轉

數值轉字符串----str(num_var)

字符串轉數值----int(str_var)。注意str_var只有全是數字字符(0-9)時才能轉成功,如變量含有數字之外的字符(如abcd等)轉換會報錯:ValueError: invalid literal for int() with base 10

 

三、字符串和byte互轉

字符串轉byte----str_var.encode()

byte轉字符串----byte_var.decode()

 

四、網絡數據包/二進制文件中的各種互轉

分析一個網絡數據包/二進制文件,基本進行的操作就是將bin十六進制轉int、轉byte、轉str;而相反,構造一個網絡數據包/二進制文件,要做的就是將int、將byte、將str轉bin十六進制。

4.1 概念定義

由於bin十六進制、int、byte、str這幾個概念不是標准稱呼(我也不懂標准稱呼是什么),所以下邊先用一張wireshark截獲取一個http數據包的截圖對這幾個名詞的定義進行約定,然后對各種轉換的意思進行說明。

4.1.1 bin十六進制/int/byte/str的定義

bin十六進制----圖中b“\x01\x79”、b“\x04\xf9\x38\xad\x13\x26”等十六進制表示形式;每一位是4bit的十六進制數

int----就是正常的10進制整數,如圖中Total Lenght的377等值

byte----b‘04f9381326’的形式;每一位是ascii編碼的byte(8bit)

str----就是字符串,如圖中的“HTTP”等

 

4.1.2 bin十六進制和int/byte/str互轉的定義

bin十六進制轉int----將二進制文件中的b“\x01\x79”轉為“377”的過程。本質上講,就是把一個byte型十六進制數,轉成十進制數的過程。(注意區別:int(0x178)時參數0x179是16進制整型而b'\x01\x79'是byte數組)

int轉bin十六進制----將“377”轉為二進制文件中的b“\x01\x79”的過程。本質上講,就是把一個十進制數,轉成byte型十六進制數的過程。(注意區別:hex(377)得到的0x179是16進制整型而b'\x01\x79'是byte數組)

bin十六進制轉byte----將二進制文件中的b“\x04\xf9\x38\xad\x13\x26”取為b‘04f9381326’的過程。本質上講,就是將每個十六進制數(4bit),轉成一個采用ascii編碼的byte(8bit)的過程。

byte轉bin十六進制----將b‘04f9381326’取為二進制文件中的b“\x04\xf9\x38\xad\x13\x26”的過程。本質上講,就是將每個采用ascii編碼的byte(8bit),轉成一個十六進制數(4bit)的過程。

bin十六進制轉str----將二進制文件中b'\x48\x54\x54\x50'取為字符串‘HTTP’的過程。本質上講,就是將ascii編碼轉成對應字符的過程。

str轉bin十六進制----將字符串‘HTTP’取為二進制文件中b'\x48\x54\x54\x50'的過程。本質上講,字符轉成就是對應的ascii編碼的過程。

 

4.2 各種互轉實現

4.2.1 bin十六進制與int互轉實現

bin十六進制轉int主要在分析二進制文件、數據包頭時獲取長度等值時使用;相反,int轉bin十六進制就是在構造二進制文件、數據包頭時寫入長度等值時使用。

另外注意把bin十六進制當數值時有大端和小端兩種模式,大端意思是開頭(低地址)權重大,小端為開頭(低地址)權重小。文件系統一般用小端模式,網絡傳輸一般用大端模式。

int轉bin十六進制----num_var.to_bytes(lenght,byteorder),lenght表示轉成的多少個字節;byteorder可為big或little分別表示轉bin十六進制時使用大端模式還是小端模式。

bin十六進制轉int----int.from_bytes(byte_var,byteorder),byte_var是要轉成數值的變bin十六進制變量,byteorder還是一樣可為big或little,分別表示從bin十六進制轉為數值時把bin十六進制當大端模式還是小端模式處理。

注意圖中的b'\x01y'其實就是b'\x01\x79'(y的ascii編碼是十六進制的79)

 

4.2.2 bin十六進制和byte互轉實現

bin十六進制轉byte主要在分析二進制文件、數據包頭時獲取mac地址、密鑰等平時就以十六進制表示的值時使用;相反,byte轉bin十六進制就是在構造二進制文件、數據包頭時寫入mac地址、密鑰等平時就以十六進制表示的值時使用。

bin十六進制轉byte----binascii.b2a_hex(bin_var),bin_var為byte變量常從二進制文件中讀出; 如binascii.b2a_hex(b'\x04\xf9\x38\xad\x13\x26')結果為b’04f9381326‘

byte轉bin十六進制----binascii.a2b_hex(hex_byte_var),hex_byte_var為十六進制字節串; 如binascii.a2b_hex(b'04f9381326')結果為b'\x04\xf98\x13&'(8對應的ascii編碼是38,&對應的ascii編碼是26)

 

 

4.2.3 bin十六進制與str互轉

bin十六進制轉主要在分析二進制文件、數據包頭時獲取其量的字符串時使用;相反,byte轉bin十六進制就是在構造二進制文件、數據包頭時寫入字符串時使用。

bin十六進制與str互轉其實就是上邊第三大點中的字符串和byte互轉;此處的bin十六進制就是上邊第三大點中的byte的本質。(b'\x48\x54\x54\x50'和b'HTTP'在內存中是一模一樣的)

 

參考:

http://www.runoob.com/python3/python3-conversion-binary-octal-hexadecimal.html

https://docs.python.org/3/library/binascii.html

 


免責聲明!

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



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