web-dev-qa-db-ja.com

Python 3.1.1 16進数の文字列

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?

59
Stuart

hexコーデックは3.xでサポートされています。代わりに binascii を使用します。

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

あなたはすでにいくつかの良い答えを持っていますが、私もあなたが少しの背景に興味があるかもしれないと思いました。

まず、引用符がありません。そのはず:

"hello".encode("hex")

第二に、このコーデックはPython 3.1。 here を参照してください。これらのコーデックを=に含めるべきかどうかまだ決定していないようです。 Python 3または別の方法で実装されています。

そのバグに添付されている diff file を見ると、提案された実装方法がわかります。

import binascii
output = binascii.b2a_hex(input)
22
Mark Byers

binascii methodesは簡単です

>>> 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'

それが役に立てば幸い。 :)

18
iMagur

Python 3)では、文字列をバイトにエンコードし、hex()メソッドを使用して文字列を返します。

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

オプションで、文字列をバイトに戻します。

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

Python 3、すべての文字列はUnicodeです。通常、Unicodeオブジェクトを文字列にエンコードする場合、hexはテキストではないため、.encode('TEXT_ENCODING')を使用しますエンコーディングでは、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」はユニコードであるため、16進数にエンコードする前にバイト文字列として指定する必要があります。これは、encodeメソッドを使用する元のアプローチとよりインラインになる可能性があります。

binascii.hexlifyおよびcodecs.encodeは次のとおりです。

  • binascii.hexlify

    バイナリデータの16進表現。

    戻り値はバイトオブジェクトです。

    タイプ:builtin_function_or_method

  • codecs.encode

    encode(obj、[encoding [、errors]])->オブジェクト

    エンコード用に登録されたコーデックを使用してobjをエンコードします。エンコーディングのデフォルトはデフォルトのエンコーディングです。異なるエラー処理スキームを設定するためにエラーが与えられる場合があります。デフォルトは「strict」で、エンコードエラーがValueErrorを発生させることを意味します。他の可能な値は、「ignore」、「replace」、「xmlcharrefreplace」、およびValueErrorを処理できるcodecs.register_errorに登録されている他の名前です。

    タイプ:builtin_function_or_method

8
Devy

base64.b16encode および base64.b16decode バイトを16進数との間で変換し、すべてのPythonバージョン。 codecsアプローチ も機能しますが、Python 3。

6
Gabriel

Python 3.xは次のとおりです:

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

utf-8文字を使用してPython Interpreterに文字列を手動で入力する場合は、b文字列:

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

Python 2.x:と同等

>>> 'halo'.encode('hex')
'68616c6f'
4
simhumileco
3
Ofir

さらに別の方法:

_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。

1
Francis Laclé