簡體   English   中英

Python 3.1.1 字符串到十六進制

[英]Python 3.1.1 string to hex

我正在嘗試使用str.encode()但我得到

>>> "hello".encode(hex)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: must be string, not builtin_function_or_method

我嘗試了很多變體,它們似乎都可以在 Python 2.5.2 中工作,那么我需要做什么才能讓它們在 Python 3.1 中工作?

hex編解碼器已被夾在 3.x 中。 使用binascii代替:

>>> binascii.hexlify(b'hello')
b'68656c6c6f'

在 Python 3.5+ 中,將字符串編碼為字節並使用hex()方法,返回一個字符串。

s = "hello".encode("utf-8").hex()
s
# '68656c6c6f'

(可選)將字符串轉換回字節:

b = bytes(s, "utf-8")
b
# b'68656c6c6f'

你已經得到了一些很好的答案,但我認為你可能也對一些背景感興趣。

首先,您缺少引號。 它應該是:

"hello".encode("hex")

其次,此編解碼器尚未移植到 Python 3.1。 這里 似乎他們還沒有決定這些編解碼器是否應該包含在 Python 3 中或以不同的方式實現。

如果您查看附加到該錯誤的diff 文件,您可以看到建議的實現方法:

import binascii
output = binascii.b2a_hex(input)

順便說一下,binascii 方法更容易

>>> import binascii
>>> x=b'test'
>>> x=binascii.hexlify(x)
>>> x
b'74657374'
>>> y=str(x,'ascii')
>>> y
'74657374'
>>> x=binascii.unhexlify(x)
>>> x
b'test'
>>> y=str(x,'ascii')
>>> y
'test'

希望能幫助到你。 :)

在 Python 3.5 及更高版本中執行此操作的最簡單方法是:

>>> 'halo'.encode().hex()
'68616c6f'

如果您使用utf-8字符手動將字符串輸入到 Python 解釋器中,您可以通過在字符串前鍵入b更快地輸入:

>>> b'halo'.hex()
'68616c6f'

在 Python 2.x 中等效:

>>> 'halo'.encode('hex')
'68616c6f'

在 Python 3 中,所有字符串都是 unicode。 通常,如果您將 unicode 對象編碼為字符串,則使用.encode('TEXT_ENCODING') ,因為hex不是文本編碼,您應該使用codecs.encode()來處理任意編解碼器。 例如:

>>>> "hello".encode('hex')
LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>>> import codecs
>>>> codecs.encode(b"hello", 'hex')
b'68656c6c6f'

同樣,由於“hello”是 unicode,您需要在編碼為十六進制之前將其指示為字節字符串。 這可能更符合您使用encode方法的原始方法。

binascii.hexlifycodecs.encode的區別如下:

  • binascii.hexlify

    二進制數據的十六進制表示。

    返回值是一個字節對象。

    類型:builtin_function_or_method

  • 編解碼器.encode

    encode(obj, [encoding[,errors]]) -> 對象

    使用為編碼注冊的編解碼器對 obj 進行編碼。 encoding 默認為默認編碼。 可能會給出錯誤以設置不同的錯誤處理方案。 默認為“嚴格”,意味着編碼錯誤會引發 ValueError。 其他可能的值是 'ignore'、'replace' 和 'xmlcharrefreplace' 以及使用 codecs.register_error 注冊的可以處理 ValueError 的任何其他名稱。

    類型:builtin_function_or_method

base64.b16encodebase64.b16decode將字節與十六進制base64.b16decode轉換,並適用於所有 Python 版本。 編解碼器方法也有效,但在 Python 3 中不太直接。

還有一種方法:

s = 'hello'

h = ''.join([hex(ord(i)) for i in s]);

# outputs: '0x680x650x6c0x6c0x6f'

這基本上將字符串拆分為字符,通過hex(ord(char)) ,並將字符重新連接在一起。 如果您想要沒有前綴0x的結果,請執行以下操作:

h = ''.join([str(hex(ord(i)))[2:4] for i in s]);

# outputs: '68656c6c6f'

用 Python 3.5.3 測試。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM