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

Rayven Esplanada 2023年10月10日
  1. 在 Python 中使用 int() 將十六進位制轉換為 Int
  2. 在 Python 中把無字首的十六進位制字串轉換為 Int
  3. 在 Python 中把帶字首的十六進位制字串轉換為 Int
  4. 在 Python 中把小位元組序和大位元組序十六進位制字串轉換為英特值
  5. 在 Python 中把十六進位制轉換為有符號的整數
在 Python 中轉換十六進位制字串為 Int

本教程將演示如何在 Python 中把十六進位制字串轉換為 int。它將涵蓋不同的十六進位制格式,如有符號的、小寫的、大寫的、0x 註釋的十六進位制,以及預設的十六進位制字串。

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

在 Python 中,將十六進位制轉換為整數的最常見和最有效的方法是使用型別轉換函式 int()

這個函式接受兩個引數:一個是強制引數,即要轉換的值,另一個是可選引數,即數字格式的基數,預設為 10

其他的數字格式有 2 代表二進位制,8 代表八進位制,16 代表十六進位制。如果你把 0 作為基礎值的引數,它將從值的字首中得出數字格式。如果沒有任何字首,它將自動識別為十進位制,0b 為二進位制,0o 為八進位制,0x 為十六進位制。

在 Python 中把無字首的十六進位制字串轉換為 Int

如果十六進位制字串沒有字首,則指定 int() 函式的基值為 16。

例如:

hex_val = "beef101"

print(int(hex_val, 16))

輸出:

200208641

結果是十六進位制值 beef101 的十進位制或整數轉換。

在 Python 中把帶字首的十六進位制字串轉換為 Int

如果十六進位制字串有一個字首 0x,那麼將基值引數改為 0 以自動檢測字首。

你仍然可以傳遞 16 作為基數,但如果你要處理多個不同格式的數字值,則傳遞 0 是最好的方法。

hex_val = "0xdeadcab"

print(int(hex_val, 0))
print(int(hex_val, 16))

輸出:

233495723
233495723

在 Python 中把小位元組序和大位元組序十六進位制字串轉換為英特值

小位元組序和大位元組序是十六進位制的兩種排序系統。預設的排序方式是小 endian,它將最重要的數字放在序列的最右邊,而大 endian 則相反。

考慮到這一點,我們要考慮的就是將大尾數的十六進位制值轉換為小尾數。之後,現在就可以對其進行通常的轉換了。

要將一個大尾數十六進位制字串轉換為小尾數的十六進位制字串,使用 bytearray.fromhex(),並對結果使用 reverse() 函式。之後,將十六進位制值轉換回字串,並將其轉換為整數。

big_endian = "efbe"


def to_little(val):
    little_hex = bytearray.fromhex(val)
    little_hex.reverse()
    print("Byte array format:", little_hex)

    str_little = "".join(format(x, "02x") for x in little_hex)

    return str_little


little_endian = to_little(big_endian)

print("Little endian hex:", little_endian)
print("Hex to int:", int(little_endian, 16))

總結一下這段程式碼。

  • 呼叫 bytearray.fromhex() 將大位元組序的十六進位制字串轉換成位元組陣列的十六進位制值。
  • 將位元組陣列反轉,將大位元組序轉換成小位元組序格式。
  • 將位元組陣列的值反轉為小位元組序的字串十六進位制格式。
  • 使用 int() 將字串轉換為整數。

輸出:

Byte array format: bytearray(b'\xbe\xef')
Little endian hex: beef
Hex to int: 48879

在 Python 中把十六進位制轉換為有符號的整數

將任何數字格式轉換為有符號的整數,都需要一個叫做 Two’s Complement的操作,這是一個針對有符號的數字進行計算的位性數學運算。

所以在我們將十六進位制轉換成有符號的整數之前,我們需要定義一個函式來執行二進位制補碼運算。

def twosComplement_hex(hexval):
    bits = 16  # Number of bits in a hexadecimal number format
    val = int(hexval, bits)
    if val & (1 << (bits - 1)):
        val -= 1 << bits
    return val

二進位制值中最左邊的位被稱為有符號位,決定整數是正數還是負數。這個函式將保留該位作為有符號的位,並通過使用位向左移位運算子 << 來移位其他位進行補償。

現在,繼續進行十六進位制值到有符號 int 的實際轉換。

hex_val1 = "ff"
hex_val2 = "ffff"
hex_val3 = "aaff"


def twosComplement_hex(hexval):
    bits = 16
    val = int(hexval, bits)
    if val & (1 << (bits - 1)):
        val -= 1 << bits
    return val


print(twosComplement_hex(hex_val1))
print(twosComplement_hex(hex_val2))
print(twosComplement_hex(hex_val3))

輸出:

255
-1
-21761

現在,我們已經實現了將一個十六進位制字串轉換為有符號的整數。

總之,我們已經涵蓋了將不同型別的十六進位制格式轉換為有符號和無符號整數的方法。使用 int() 與值和基數引數一起將十六進位制轉換為無符號整數。

如果十六進位制是大位元組序格式,先用 bytearray.fromhex()reverse() 將其轉換為小位元組序格式。

最後,如果需要將十六進位制字串轉換為有符號的整數,那麼對其上的十六進位制值進行二進位制補碼運算,得到一個有符號的整數值。

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

相關文章 - Python Hex

相關文章 - Python Integer