選單

Python各種進位制之間的轉換方法

Python各種進位制之間的轉換方法

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

1 。 2/8/10/16進位制賦值

Python各種進位制之間的轉換方法

2 。 2/8/10/16進位制互轉

Python各種進位制之間的轉換方法

二、數值和字串互轉

數值轉字串——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十六進位制。

1 。 概念定義

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

Python各種進位制之間的轉換方法

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

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編碼的過程。

2 各種互轉實現

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十六進位制當大端模式還是小端模式處理。

Python各種進位制之間的轉換方法

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

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)

Python各種進位制之間的轉換方法

2。3 bin十六進位制與str互轉

bin十六進位制轉主要在分析二進位制檔案、資料包頭時獲取其量的字串時使用;相反,byte轉bin十六進位制就是在構造二進位制檔案、資料包頭時寫入字串時使用。

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

Python各種進位制之間的轉換方法