在Python中將十六進制轉換為位元組

Rayven Esplanada 2023年9月19日
  1. 初始化一個十六進制值
  2. 使用bytes.fromhex()函數在Python中將十六進制轉換為位元組
  3. 使用binascii模組在Python中將十六進制轉換為位元組
  4. 使用codecs.decode()方法在 Python 中將十六進位轉換為位元組
  5. 使用列表生成式和int()函式在 Python 中將十六進位轉換為位元組
  6. 結論
在Python中將十六進制轉換為位元組

十六進制常縮寫為hex,使用16個符號(0-9、a-f)表示值,與十進制的10個符號形成對比。例如,十進制的1000在十六進制中表示為3E8。

熟練掌握處理hex對於涉及二進位數據、記憶體地址和低層編碼的編程任務至關重要。本教程將介紹如何在Python中將十六進制值轉換為位元組文字。

初始化一個十六進制值

讓我們使用字符串創建一個十六進制值,並使用binascii模組中的hexlify()函數將短語A quick brown fox轉換為十六進制值。

要將字符串轉換為十六進制,我們首先需要將字符串轉換為位元組。

import binascii

str_val = "A quick brown fox".encode("utf-8")
hex_val = binascii.hexlify(str_val).decode("utf-8")

print(hex_val)

輸出:

4120717569636b2062726f776e20666f78

現在,我們成功地將字符串轉換為十六進制值。接下來,讓我們繼續將十六進制轉換回位元組。

使用bytes.fromhex()函數在Python中將十六進制轉換為位元組

bytes.fromhex()方法用於將有效的十六進制字符串轉換為bytes對象。它的語法如下:

bytes.fromhex(hex_string)
  • hex_string:這是一個必需的參數,表示要轉換為位元組文字的輸入十六進制字符串。

下面是bytes.fromhex()方法的工作原理:

  1. 輸入驗證:該方法首先驗證輸入的hex_string,確保它只包含有效的十六進制字符(數字0-9和小寫或大寫字母A-F)。如果字符串包含任何其他字符,它將引發ValueError
  2. 解析配對:該方法以每次兩個字符的方式處理十六進制字符串,將每對字符視為一個十六進制位元組。這意味著對於輸入字符串中的每兩個字符,將在生成的bytes對象中生成一個位元組。
  3. 轉換為位元組:將每對十六進制字符轉換為其二進制等效值。
  4. 構建bytes對象:當該方法處理十六進制字符的配對時,通過附加每個位元組的二進制表示來構建一個bytes對象。這個過程會持續進行,直到整個輸入字符串都被處理完畢。
  5. 返回值:當整個輸入字符串被處理完畢時,該方法返回表示輸入十六進制字符串的位元組文字的bytes對象。

例如,我們將使用之前結果中的十六進制值,並使用fromhex()將其轉換為位元組文字。

hex_val = "4120717569636b2062726f776e20666f78"

print(bytes.fromhex(hex_val))

輸出:

b'A quick brown fox'

讓我們分解示例十六進制字符串4120717569636b2062726f776e20666f78,以更好地理解它是如何轉換為位元組文字的:

  • 41 成為位元組 65(A的ASCII值)。
  • 20 成為位元組 32(空格的ASCII值)。
  • 71 成為位元組 113(q的ASCII值)。
  • 75 成為位元組 117(u的ASCII值)。
  • 69 成為位元組 105(i的ASCII值)。
  • 63 成為位元組 99(c的ASCII值)。
  • 6b 成為位元組 107(k的ASCII值)。
  • 20 成為位元組 32(空格的ASCII值)。
  • 62 成為位元組 98(b的ASCII值)。
  • 72 成為位元組 114(r的ASCII值)。
  • 6f 成為位元組 111(o的ASCII值)。
  • 77 成為位元組 119(w的ASCII值)。
  • 6e 成為位元組 110(n的ASCII值)。
  • 20 成為位元組 32(空格的ASCII值)。
  • 66 成為位元組 102(f的ASCII值)。
  • 6f 成為位元組 111(o的ASCII值)。
  • 78 成為位元組 120(x的ASCII值)。

當所有這些位元組結合在一起時,您獲得位元組文字A quick brown fox,這是最終結果。

使用binascii模組在Python中將十六進制轉換為位元組

binascii Python模組包含用於二進位和ASCII操作的高效實用函數。特別地,unhexlify()binascii模組中將十六進制值轉換為位元組文字的函數。

該函數具有以下語法:

binascii.unhexlify(hex_string)
  • hex_string:這是一個必需的參數,表示要轉換為位元組文字的輸入十六進制字符串。

以下是它的詳細工作原理:

  1. 輸入驗證:該方法首先驗證hex_string參數,以確保它只包含有效的十六進制字符。輸入字符串中的任何無效字符都會導致binascii.Error例外。
  2. 十六進制對轉換:接下來,該方法以每次兩個字符的方式處理hex_string。例如,41代表整數值為65的位元組(A的ASCII值)。
  3. 轉換為位元組:十六進位的位元組對將被轉換為其二進制表示法。每一對將轉換為一個對應的位元組,每個字元代表 4 位元。
  4. 建構位元組字面值:當方法處理每一對時,它將結果二進制位元組附加到一起,形成一個完整的位元組字面值。這個過程會持續進行,直到整個輸入字串被處理完畢。
  5. 返回值:一旦整個hex_string被處理完畢,unhexlify()函式會返回結果位元組字面值,表示為bytes物件。

讓我們以特殊的非 ASCII 字元初始化一個新的範例,然後將其轉換為十六進位值。該範例將是短句A quick brown fox的希臘翻譯。

import binascii
from binascii import unhexlify

str_val = "Μια γρήγορη καφέ αλεπού".encode(
    "utf-8"
)  # A quick brown fox in Greek translation
hex_val = binascii.hexlify(str_val).decode("utf-8")

print("String value: ", str_val.decode("utf-8"))
print("Hexadecimal: ", hex_val)
print("Byte value: ", unhexlify(hex_val))

輸出:

String value:  Μια γρήγορη καφέ αλεπού
Hexadecimal:  ce9cceb9ceb120ceb3cf81ceaeceb3cebfcf81ceb720cebaceb1cf86cead20ceb1cebbceb5cf80cebfcf8d
Byte value:  b'\xce\x9c\xce\xb9\xce\xb1 \xce\xb3\xcf\x81\xce\xae\xce\xb3\xce\xbf\xcf\x81\xce\xb7 \xce\xba\xce\xb1\xcf\x86\xce\xad \xce\xb1\xce\xbb\xce\xb5\xcf\x80\xce\xbf\xcf\x8d'

我們現在已成功將十六進位值轉換為位元組。

使用codecs.decode()方法在 Python 中將十六進位轉換為位元組

codecs.decode()函式也可用於將十六進位字串轉換為位元組。它是 Python 的codecs模組的一部分,該模組為不同的資料表示提供各種編碼和解碼功能。

它的語法如下:

codecs.decode(data, encoding, errors="strict")
  • data:這是代表想要解碼的資料的必需引數。在這種情況下,它應該是您希望轉換為位元組字面值的十六進位字串。
  • encoding:這也是一個必需引數,用於指定要使用的編碼進行解碼。在處理十六進位字串時,應該使用hex編碼,以指示輸入字串表示十六進位值。
  • errors(可選):此引數指定如何處理解碼錯誤,例如當輸入字串包含指定編碼的無效字元時。它的預設值為strict,但您可以將其更改為ignorereplace以不同方式處理錯誤。

下面是詳細解釋此方法在解碼十六進位值時的工作方式:

  1. 輸入驗證:該方法首先檢查data引數的有效性,以確保它僅包含有效的十六進位字元。如果輸入字串包含任何非十六進位字元,它將引發帶有有關問題字元的UnicodeDecodeError
  2. 解碼過程:codecs.decode()函式將data引數解釋為十六進位字串,並將其轉換為二進制資料。它以一對字元的方式處理輸入字串,將每一對視為單個十六進位位元組。
  3. 編碼規格:在此情境中,encoding引數至關重要。當您指定'hex'作為編碼時,它告訴 Python 解釋輸入字串為十六進位值並相應地進行轉換。
  4. 轉換為位元組:隨著方法處理每一對十六進位字元,它將其轉換為其二進制表示法。這個轉換導致創建一個位元組字面值,其中每一對字元對應一個單個位元組。
  5. 返回值:codecs.decode()方法將結果位元組字面值作為bytes物件返回,表示解碼的二進制資料。

請看下面的範例:

import codecs

hex_val = "4120717569636b2062726f776e20666f78"
byte_val = codecs.decode(hex_val, "hex")
print(byte_val)

此程式使用將編碼引數設置為'hex'codecs.decode()函式解碼hex_val字串。這意味著它將將輸入字串解釋為十六進位值並將其轉換為位元組。

輸出:

b'A quick brown fox'

使用列表生成式和int()函式在 Python 中將十六進位轉換為位元組

此方法涉及使用列表生成式和int()函式將十六進位字串轉換為位元組。

hex_val = "4120717569636b2062726f776e20666f78"
byte_val = bytes([int(hex_val[i : i + 2], 16) for i in range(0, len(hex_val), 2)])
print(byte_val)

在這裡,程式使用列表生成式來逐對兩個字元迭代十六進位字串,將每對轉換為 16 進位(十六進位)的整數,並創建這些整數的列表。

然後使用bytes()建構函式將這個整數列表轉換為一個位元組物件。

輸出:

b'A quick brown fox'

當我們有一個已知結構的十六進位字串並且想要高效轉換為位元組時,此方法尤其有用。它允許我們指定編碼的基數(在這種情況下是十六進位的基數),從而控制轉換過程。

結論

在本文中,我們介紹了一些將十六進制值轉換為 Python 中的字節文字的方法。

如果您不希望在源代碼中添加其他導入,則首選 fromhex() 函数。否則,您可以選擇最適合您需求和編程風格的方法。

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 Bytes

相關文章 - Python Hex