使用 Python 完全攻略十六進位|進位轉換、字串操作、實用範例詳細解析

目次

1. 前言

Python 是一種因語法簡潔且擁有豐富函式庫而被廣泛使用的程式語言。其中,「十六進位」的處理功能在資料處理、位元運算、色碼操作等多種應用中扮演重要角色。

十六進位是使用數字 0 到 9 和字母 A 到 F 來表示數值的一種方式。與以 10 為基礎的十進位不同,十六進位是以 16 為一單位遞增,這使它非常適合用於電腦內部資料處理及簡潔數值表示。對程式開發者來說,特別是在處理記憶體位址或位元操作時,十六進位是不可或缺的知識。

本指南將從基本概念到實用範例,深入淺出地說明如何在 Python 中操作十六進位。即使是初學者也能安心學習,因為我們會從基礎一步步帶你理解。

2. 在 Python 中操作十六進位的基本方式

Python 提供了多種方便的功能,讓你可以輕鬆處理十六進位數值。本節將詳細介紹十六進位的寫法、如何將整數轉為十六進位,以及如何將十六進位字串轉回整數。

十六進位的寫法

在 Python 中,若要將數值表示為十六進位,需在數值前加上 0x0X 前綴。例如,可如下定義十六進位:

# 十六進位寫法
hex_number = 0x1A3F
print(hex_number)  # 輸出: 6719

在此例中,我們定義了一個十六進位的 0x1A3F 並將其以十進位形式顯示。雖然 Python 內部是以十進位進行計算,但你仍可使用十六進位作為數值的表示方式。

將整數轉為十六進位

Python 提供內建函式 hex(),可將整數轉換為十六進位表示。使用此函式可以非常輕鬆地完成轉換。

# 將整數轉為十六進位
number = 255
hex_number = hex(number)
print(hex_number)  # 輸出: 0xff

hex() 函式會回傳一個字串,其內容會包含 0x 前綴,以標示這是一個十六進位數值。

將十六進位字串轉為整數

若想將十六進位的字串轉換為整數,可使用 int() 函式,並在第二個參數中指定基數為 16。

# 將十六進位字串轉為整數
hex_string = "1A3F"
decimal_number = int(hex_string, 16)
print(decimal_number)  # 輸出: 6719

透過這種方式,你可以輕鬆地將十六進位字串轉換為整數格式來進行後續的數值處理。

3. 如何在 Python 中進行進位轉換

在 Python 中,可以輕鬆地在二進位、八進位、十進位和十六進位之間進行數值轉換。本節將詳細介紹可用於進位轉換的內建函式 bin()oct()hex() 以及 int()

二進位、八進位、十六進位的基本表示方式

處理數值時,以下是常見的進位表示:

  • 二進位(binary):使用 0b0B 前綴表示。
  • 八進位(octal):使用 0o0O 前綴表示。
  • 十六進位(hexadecimal):使用 0x0X 前綴表示。

以下為這些進位在 Python 中的實際寫法:

# 不同進位的表示範例
binary_number = 0b1101  # 二進位
octal_number = 0o17     # 八進位
hex_number = 0x1A       # 十六進位

print(binary_number)  # 輸出: 13
print(octal_number)   # 輸出: 15
print(hex_number)     # 輸出: 26

在 Python 中,你可以直接使用這些進位的數值表示,系統會自動將其轉為十進位進行計算。

如何在不同進位之間互相轉換

從十進位轉換為其他進位

你可以使用下列內建函式,將十進位的整數轉換為其他進位格式:

  • bin(): 將十進位轉為二進位。
  • oct(): 將十進位轉為八進位。
  • hex(): 將十進位轉為十六進位。

範例:

# 將十進位轉為其他進位
decimal_number = 42

binary_result = bin(decimal_number)
octal_result = oct(decimal_number)
hexadecimal_result = hex(decimal_number)

print(binary_result)    # 輸出: 0b101010
print(octal_result)     # 輸出: 0o52
print(hexadecimal_result)  # 輸出: 0x2a

從其他進位轉換為十進位

使用 int() 函式可將任意進位的字串轉為十進位,需指定第二個參數為該字串的進位(例如 2、8 或 16)。

範例:

# 將不同進位的字串轉為十進位
binary_string = "101010"
octal_string = "52"
hexadecimal_string = "2A"

decimal_from_binary = int(binary_string, 2)
decimal_from_octal = int(octal_string, 8)
decimal_from_hexadecimal = int(hexadecimal_string, 16)

print(decimal_from_binary)    # 輸出: 42
print(decimal_from_octal)     # 輸出: 42
print(decimal_from_hexadecimal)  # 輸出: 42

透過這些方式,可以輕鬆在不同進位之間進行轉換。

進位之間的連續轉換

例如,若要從二進位轉為十六進位,需先將其轉為十進位,再進一步轉為十六進位。

範例:

# 將二進位轉為十六進位
binary_string = "101010"
decimal_value = int(binary_string, 2)  # 先轉為十進位
hexadecimal_value = hex(decimal_value)  # 再轉為十六進位

print(hexadecimal_value)  # 輸出: 0x2a

如上所示,只要搭配使用內建函式,就能簡單完成進位之間的連續轉換。

4. 在 Python 中進行字串與十六進位之間的轉換

在 Python 中,將字串轉為十六進位,或將十六進位還原為原始字串的操作非常簡單。本節將說明如何透過編碼將字串轉為十六進位,以及如何解碼十六進位還原為字串。

將字串轉為十六進位(編碼)

若要將字串轉為十六進位表示,需先將其轉為位元組(bytes),再進一步轉為十六進位。這可透過 encode() 方法搭配 binascii.hexlify()bytes.hex() 實現。

範例:

# 將字串編碼為十六進位
import binascii

text = "Hello, Python!"
# 轉為 bytes
byte_data = text.encode("utf-8")
# 轉為十六進位字串
hex_data = binascii.hexlify(byte_data).decode("utf-8")

print(hex_data)  # 輸出: 48656c6c6f2c20507974686f6e21

也可以使用 bytes.hex() 的簡潔寫法:

# 簡潔寫法:字串轉十六進位
text = "Hello, Python!"
hex_data = text.encode("utf-8").hex()

print(hex_data)  # 輸出: 48656c6c6f2c20507974686f6e21

以上範例中,我們將字串 "Hello, Python!" 轉為位元組後再轉為十六進位表示。

將十六進位轉回字串(解碼)

若要將十六進位的字串還原為原始字串,可先將其轉為 bytes,再解碼為字串。

範例:

# 將十六進位解碼為原始字串
import binascii

hex_data = "48656c6c6f2c20507974686f6e21"
# 十六進位轉為 bytes
byte_data = binascii.unhexlify(hex_data)
# 解碼為字串
text = byte_data.decode("utf-8")

print(text)  # 輸出: Hello, Python!

也可使用 bytes.fromhex() 來簡化:

# 簡潔寫法:十六進位還原字串
hex_data = "48656c6c6f2c20507974686f6e21"
text = bytes.fromhex(hex_data).decode("utf-8")

print(text)  # 輸出: Hello, Python!

使用這種方式可以輕鬆地將十六進位轉換回原始字串內容。

應用範例:檔案資料的十六進位轉換

這種技術不僅適用於文字,也可用於處理二進位檔案(如圖片或音訊)並轉為十六進位表示。

# 將檔案轉為十六進位表示
with open("example.txt", "rb") as file:
    binary_data = file.read()
    hex_data = binary_data.hex()

print(hex_data)  # 將檔案內容輸出為十六進位
RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

5. 使用 Python 進行十六進位的位元運算

十六進位在進行位元運算時非常方便。位元運算是一種針對數值中每一個位元進行操作的方法,常用於高效資料處理、硬體控制、加密演算法等情境。本節將介紹如何使用 Python 對十六進位進行基本的位元運算與實際範例。

位元運算的基本概念與 Python 中的運算子

位元運算包含以下幾種基本操作,Python 也提供對應的運算子:

| 位元運算類型 | 運算子 | 說明 |
||–|–|
| AND(與)運算 | & | 僅當兩個位元都是 1 時,結果為 1 |
| OR(或)運算 | | | 只要有任一位元為 1,結果為 1 |
| XOR(互斥或)運算 | ^ | 當兩個位元不同時,結果為 1 |
| NOT(反相)運算 | ~ | 將每個位元反轉 |
| 左位移 | << | 將位元向左移動指定次數 |
| 右位移 | >> | 將位元向右移動指定次數 |

十六進位的位元運算範例

以下為使用十六進位進行各種位元運算的實例:

AND(與)運算

# 十六進位的 AND 運算
a = 0xF0  # 十六進位表示 240
b = 0x0F  # 十六進位表示 15

result = a & b
print(hex(result))  # 輸出: 0x0

因為沒有相同位置的位元同時為 1,所以結果為 0x0

OR(或)運算

# 十六進位的 OR 運算
a = 0xF0
b = 0x0F

result = a | b
print(hex(result))  # 輸出: 0xff

任一位元為 1 即為 1,結果為 0xFF

XOR(互斥或)運算

# 十六進位的 XOR 運算
a = 0xF0
b = 0x0F

result = a ^ b
print(hex(result))  # 輸出: 0xff

當兩位元不同時,結果為 1,結果為 0xFF

NOT(反相)運算

# 十六進位的 NOT 運算
a = 0xF0

result = ~a
print(hex(result))  # 輸出: -0xf1

位元全部反轉後,會得到補數形式的負值,Python 會以帶符號整數表示。

位移運算

# 左位移
a = 0x01  # 十六進位的 1
result = a << 4
print(hex(result))  # 輸出: 0x10

# 右位移
a = 0x10  # 十六進位的 16
result = a >> 4
print(hex(result))  # 輸出: 0x1

左移會使數值乘以 2 的次方,右移則會除以 2 的次方。

應用範例:旗標(Flag)操作

位元運算在旗標控制(如權限設定)中也非常實用。以下為一個簡單的旗標控制範例:

# 旗標操作範例
FLAG_READ = 0x01     # 讀取權限
FLAG_WRITE = 0x02    # 寫入權限
FLAG_EXECUTE = 0x04  # 執行權限

# 設定讀寫權限
permissions = FLAG_READ | FLAG_WRITE
print(hex(permissions))  # 輸出: 0x3

# 移除寫入權限
permissions = permissions & ~FLAG_WRITE
print(hex(permissions))  # 輸出: 0x1

# 檢查是否有執行權限
has_execute = permissions & FLAG_EXECUTE
print(bool(has_execute))  # 輸出: False

透過位元運算,可以高效地控制多個條件與狀態。

6. 十六進位的實用應用範例

十六進位在程式設計的各個領域中都有實際應用。本節將介紹幾個常見的使用情境,包括色碼表示、記憶體位址操作,以及二進位資料的處理。

色碼的表示與操作

在 HTML 或 CSS 中,色碼通常以十六進位表示。每個 RGB 色彩成分皆以兩位十六進位數值呈現。

基本範例:產生十六進位色碼

# 從 RGB 值產生十六進位色碼
def rgb_to_hex(red, green, blue):
    return f"#{red:02x}{green:02x}{blue:02x}"

color = rgb_to_hex(255, 165, 0)  # 橘色
print(color)  # 輸出: #ffa500

此範例中,我們根據 RGB 值產生標準格式的十六進位色碼。

進階範例:將十六進位色碼轉為 RGB

# 從十六進位色碼轉換為 RGB 值
def hex_to_rgb(hex_color):
    hex_color = hex_color.lstrip("#")
    return tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))

rgb = hex_to_rgb("#ffa500")
print(rgb)  # 輸出: (255, 165, 0)

透過簡單的分段與轉換,即可將色碼還原為 RGB 數值。

記憶體位址的表示

十六進位常用於表示電腦中的記憶體位址。在 Python 中,可以使用 id() 函式取得變數的記憶體位址,並以十六進位格式顯示。

# 顯示變數的記憶體位址
variable = 42
address = hex(id(variable))

print(address)  # 輸出: 例如 0x7ffee4d9c710

這在除錯或低階開發中相當實用。

處理二進位資料

十六進位在操作二進位資料(例如圖片、音訊檔)時非常方便,因其可用來直觀檢視資料內容。

將檔案內容以十六進位顯示

# 讀取檔案並顯示為十六進位
def read_file_as_hex(file_path):
    with open(file_path, "rb") as file:
        data = file.read()
        return data.hex()

hex_data = read_file_as_hex("example.bin")
print(hex_data)  # 將檔案內容以十六進位顯示

操作二進位資料

以下為修改二進位資料中特定位元組的範例:

# 修改二進位資料
import binascii

original_data = b" \xff\xa5 "
modified_data = original_data[:1] + b"\x01" + original_data[2:]

print(binascii.hexlify(modified_data))  # 輸出: 00ff0100

此方法能有效進行低階資料的處理與修改。

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

7. 總結

本文從基礎到進階範例,全面說明了如何在 Python 中操作十六進位的技巧與應用。以下將回顧各章節重點,並補充使用十六進位時應注意的事項。

重點回顧

  1. 前言
  • 十六進位在程式設計與資料處理中扮演重要角色。
  • Python 提供簡潔又強大的十六進位處理工具。
  1. Python 中操作十六進位的基本方式
  • 使用 0x 表示十六進位。
  • hex() 可將整數轉為十六進位,int() 可將十六進位字串轉回整數。
  1. 進位之間的轉換
  • 使用 bin()oct()hex()int() 等函式即可輕鬆轉換。
  • 實例說明如何在 2、8、10、16 進位之間進行轉換。
  1. 字串與十六進位之間的轉換
  • 可透過 encode()hex() 將字串轉為十六進位。
  • 使用 bytes.fromhex()binascii.unhexlify() 可還原原始字串。
  1. 使用十六進位進行位元運算
  • 說明 AND、OR、XOR、NOT、位移等基本運算。
  • 透過實例展示如何進行權限旗標的管理。
  1. 十六進位的實用範例
  • 示範色碼產生與轉換、記憶體位址顯示、二進位資料操作等常見應用。

使用十六進位時的注意事項

  1. 確認資料型態
  • 十六進位常以字串形式表示,進行數學運算前需轉換為整數型別。
  1. 大小寫的差異
  • Python 不區分 A-Fa-f,但與外部系統交換時建議統一格式。
  1. 錯誤處理
  • 若輸入無效的十六進位字串(例如 "G123"),將會產生錯誤,需事前驗證資料。
  1. 效率考量
  • 處理大量位元或二進位資料時,應選擇效率高的演算法與方法。

結語

掌握 Python 中的十六進位操作,對程式設計師而言是一項實用的技能。希望透過本篇文章,能幫助你從基礎學起,擴展在資料處理與演算法設計方面的應用能力。

請根據實際需求選擇合適的方法與工具,高效地運用十六進位技巧。這就是本篇 Python 十六進位指南的全部內容,祝你在未來的學習與專案中順利應用!

FAQ:使用 Python 操作十六進位的常見問題

Q1: 如何將整數轉換為十六進位?

使用 Python 內建的 hex() 函式即可。

number = 255
hex_number = hex(number)
print(hex_number)  # 輸出: 0xff

若要去除 0x 前綴,可以使用字串切片:

clean_hex = hex(number)[2:]
print(clean_hex)  # 輸出: ff

Q2: 如何將十六進位字串轉換為整數?

使用 int() 函式並指定第二個參數為 16:

hex_string = "ff"
decimal_number = int(hex_string, 16)
print(decimal_number)  # 輸出: 255

Q3: 十六進位的大小寫有差別嗎?

在 Python 中大小寫無差別,"FF""ff" 代表相同數值:

hex_upper = "FF"
hex_lower = "ff"

print(int(hex_upper, 16))  # 輸出: 255
print(int(hex_lower, 16))  # 輸出: 255

可使用 upper()lower() 統一格式:

Q4: 如何從十六進位字串產生 bytes?

使用 bytes.fromhex()

hex_string = "48656c6c6f"  # 表示 "Hello"
byte_data = bytes.fromhex(hex_string)
print(byte_data)  # 輸出: b'Hello'

反過來,將 bytes 轉回十六進位:

print(byte_data.hex())  # 輸出: 48656c6c6f

Q5: 如何不顯示 0x 前綴?

number = 255
hex_number = hex(number)[2:]
print(hex_number)  # 輸出: ff

也可使用格式化字串:

number = 255
formatted_hex = f"{number:x}"  # 小寫
formatted_hex_upper = f"{number:X}"  # 大寫
print(formatted_hex)        # 輸出: ff
print(formatted_hex_upper)  # 輸出: FF

Q6: Python 可以進行十六進位的加法嗎?

可以,計算會自動以整數處理,結果可轉為十六進位:

a = 0xA  # 十六進位的 10
b = 0x5  # 十六進位的 5

result = a + b
print(hex(result))  # 輸出: 0xf

Q7: 處理錯誤的十六進位字串會怎樣?

會拋出 ValueError,建議使用 try-except:

hex_string = "G123"  # 無效的十六進位
try:
    decimal_number = int(hex_string, 16)
except ValueError as e:
    print(f"錯誤: {e}")  # 輸出: 錯誤: invalid literal for int() with base 16: 'G123'

Q8: 如何產生十六進位的色碼?

def rgb_to_hex(r, g, b):
    return f"#{r:02x}{g:02x}{b:02x}"

color = rgb_to_hex(255, 165, 0)
print(color)  # 輸出: #ffa500

Q9: 如何將二進位資料轉為十六進位?

with open("example.bin", "rb") as file:
    binary_data = file.read()
    hex_data = binary_data.hex()

print(hex_data)  # 輸出為十六進位

Q10: 如何在 Python 中轉換十六進位與其他進位?

# 十進位轉十六進位
hex_value = hex(255)  # 輸出: 0xff

# 二進位轉十六進位
binary_value = "11111111"
hex_value = hex(int(binary_value, 2))  # 輸出: 0xff

# 八進位轉十六進位
octal_value = "377"
hex_value = hex(int(octal_value, 8))  # 輸出: 0xff