HOWTO · Python

在 Python 中轉換十六進位制字串為 Int

它演示瞭如何在 Python 中把十六進位制轉換為整數。

本頁內容

在 Python 中,可使用 int(value, 16) 將十六進位字串轉換為整數。若要讓 Python 根據 0x 字首判斷進位基底,請使用 0;若輸入代表具有指定位元組序或有號位元寬度的位元組,則使用 int.from_bytes()。

在 Python 中使用 int() 將十六進位轉換為整數

int() 函式接受字串和選用的進位基底。預設基底是 10,因此處理十六進位文字時要傳入 16。在 int(value, base) 中,第二個引數代表輸入字串的進位基底,不是位元寬度。將 value 換成要解析的十六進位文字即可。

在 Python 中將無字首的十六進位字串轉換為整數

如果十六進位數字沒有 0x 或 0X 字首,請明確傳入基底 16。從文字檔、API 或使用者輸入讀取值時,這種寫法很實用。

hex_string = "1a"
integer_value = int(hex_string, 16)
print(integer_value)
26

結果是 26:基底 16 會告訴 int() 將每個數字解讀為十六進位。如果字串帶有字首,可以使用基底 16,也可以像下一節所示,讓 int() 判斷字首。

在 Python 中將帶字首的十六進位字串轉換為整數

處理帶字首的十六進位文字時,基底 0 會讓 int() 根據 0x 或 0X 等可識別的字首推斷進位基底。基底 16 也接受這些字首;如果輸入可能使用其他 Python 整數字首,基底 0 會更方便。

hex_string = "0x1a"
integer_value = int(hex_string, 0)
print(integer_value)
26

由於字串以 0x 開頭,Python 會將後續數字解析為十六進位,結果是 26。基底 0 需要可識別的字首,不會自動把沒有字首的文字當成十六進位。輸入沒有字首時,請使用基底 16。

在 Python 中將十六進位字串依小位元組序或大位元組序轉換為整數

小位元組序與大位元組序說明一串位元組如何對應到整數;單獨的十六進位文字沒有預設的位元組序。對於位元組 ef be,大位元組序會將 ef 放在前面;小位元組序則將 ef 視為最低有效位元組。將所需的位元組序傳給 int.from_bytes():

data = bytes.fromhex("ef be")
big_value = int.from_bytes(data, byteorder="big")
little_value = int.from_bytes(data, byteorder="little")
print(big_value, little_value)
61374 48879

bytes.fromhex() 會建立兩個位元組的序列,而 byteorder 會控制這些位元組如何組成結果:大位元組序會得到 61374,小位元組序則會得到 48879。這樣就能明確指定位元組序,不必手動反轉十六進位字串。

在 Python 中將十六進位轉換為有號整數

一般呼叫 int("ffff", 16) 會得到非負整數。若要將十六進位數字解讀為有號值,請先定義位元組寬度,再以 signed=True 解碼這些位元組。對於 16 位元的值,ffff 以二進位補碼表示 -1:

hex_string = "ffff"
data = bytes.fromhex(hex_string)
signed_value = int.from_bytes(data, byteorder="big", signed=True)
print(signed_value)
-1

bytes.fromhex("ffff") 會提供兩個位元組,因此這次有號轉換的寬度是 16 位元,結果為 -1。最高位元為 1,而二進位補碼決定其有號值。請依據要解碼的資料格式選擇位元組序和寬度;int() 本身不會推斷其中任一項。