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

2022-06-26 01:45:07 字數 3617 閱讀 5581

#

二進位制賦值以0b打頭

a =0b1000

#八進位制賦值以0o打頭,第乙個是數字0第二個是字母o

b =0o1100

#十進位制不需要特別標明

c = 1110

#十六進製制賦值以0x打頭

d = 0x1111

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

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

其他進製轉十進位制----int(var, base=10)

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

說明:1. 其實不管賦值時用什麼進製預設輸出都是十進位制,所以可以不需要轉換。比如賦值時寫a = 0b1000,顯示時會顯示為a等於8

2. 以上幾個函式var都為各進製的整數,以0b等標識將進行轉換的數值的原始進製,如int(0b1000);其中int的var引數還可以是字串,此時不是以0b等開頭標識字串的進製(也不要寫)而以base引數指定字串的原始進製,如int("1000", base=2),而不要寫int("0b1000"),也不要寫int("0b1000", base=2)。

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

字串轉數值----int(str_var, base=10)。參見上方說明。另外注意str_var只有所有字元都在進製所用字元範圍內時才能轉成功,如變數含有數字之外的字元(如8進製使用了9這個字元)轉換會報錯:valueerror: invalid literal for int() with base 10

解碼的本質是選擇二進位制對應的圖形,編碼的本質是把字元圖形轉成相應編碼的二進位制。這只是一種顯示的變化,在記憶體上並不一定有變化。

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

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

分析乙個網路資料報/二進位制檔案,基本進行的操作就是將bin十六進製制轉int、轉byte、轉str;而相反,構造乙個網路資料報/二進位制檔案,要做的就是將int、將byte、將str轉bin十六進製制。

由於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.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'在記憶體中是一模一樣的)

參考:

python3 各種轉換

int x for x in bytes ser.read all hex x for x in bytes ser.read all 10進製數字轉16進製制 hex 10 0xa 再轉成bytes hex 10 encode utf 8 b 0xa 16進製制數字轉10進製 int 0x0a 1...

各種進製之間的轉換

二進位制的表示方式 010101 八進位制的表示方式 01234567 十進位制的表示方式 25 十六進製制的表示方式 0x12345abc 為什麼要提出這麼多進製呢?計算機記憶體中採用的是二進位制的儲存方式,但是資料很大的話會有很多位數,所以就使用八進位制還有十六進製制數 來表示,八進位制對應二進...

各種進製之間的轉化

1 16進製制字串改為byte public static byte hexstring2buf string src return ret 2 十六進製制轉2進製 方法一 public static string hexstr2binarr string string return s priva...