6.9 編碼和解碼十六進(jìn)制數(shù)

2018-02-24 15:26 更新

問題

你想將一個(gè)十六進(jìn)制字符串解碼成一個(gè)字節(jié)字符串或者將一個(gè)字節(jié)字符串編碼成一個(gè)十六進(jìn)制字符串。

解決方案

如果你只是簡(jiǎn)單的解碼或編碼一個(gè)十六進(jìn)制的原始字符串,可以使用 binascii 模塊。例如:

>>> # Initial byte string
>>> s = b'hello'
>>> # Encode as hex
>>> import binascii
>>> h = binascii.b2a_hex(s)
>>> h
b'68656c6c6f'
>>> # Decode back to bytes
>>> binascii.a2b_hex(h)
b'hello'
>>>

類似的功能同樣可以在 base64 模塊中找到。例如:

>>> import base64
>>> h = base64.b16encode(s)
>>> h
b'68656C6C6F'
>>> base64.b16decode(h)
b'hello'
>>>

討論

大部分情況下,通過使用上述的函數(shù)來轉(zhuǎn)換十六進(jìn)制是很簡(jiǎn)單的。上面兩種技術(shù)的主要不同在于大小寫的處理。函數(shù) base64.b16decode()base64.b16encode() 只能操作大寫形式的十六進(jìn)制字母,而 binascii 模塊中的函數(shù)大小寫都能處理。

還有一點(diǎn)需要注意的是編碼函數(shù)所產(chǎn)生的輸出總是一個(gè)字節(jié)字符串。如果想強(qiáng)制以Unicode形式輸出,你需要增加一個(gè)額外的界面步驟。例如:

>>> h = base64.b16encode(s)
>>> print(h)
b'68656C6C6F'
>>> print(h.decode('ascii'))
68656C6C6F
>>>

在解碼十六進(jìn)制數(shù)時(shí),函數(shù) b16decode()a2b_hex() 可以接受字節(jié)或unicode字符串。但是,unicode字符串必須僅僅只包含ASCII編碼的十六進(jìn)制數(shù)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)