[python] 파이썬 3에서 바이트를 16 진수 문자열로 변환하는 올바른 방법은 무엇입니까?

파이썬 3에서 바이트를 16 진수 문자열로 변환하는 올바른 방법은 무엇입니까?

나는 bytes.hex방법, bytes.decode코덱의 주장을 보았고 아무 소용없이 가장 놀라운 다른 기능을 시도했습니다. 나는 바이트를 16 진수로 원한다!



답변

Python 3.5부터는 더 이상 어색하지 않습니다.

>>> b'\xde\xad\xbe\xef'.hex()
'deadbeef'

그리고 반대로 :

>>> bytes.fromhex('deadbeef')
b'\xde\xad\xbe\xef'

가변 bytearray유형 과도 작동 합니다.

참조 : https://docs.python.org/3/library/stdtypes.html#bytes.hex


답변

binascii모듈을 사용하십시오 :

>>> import binascii
>>> binascii.hexlify('foo'.encode('utf8'))
b'666f6f'
>>> binascii.unhexlify(_).decode('utf8')
'foo'

이 답변보기 :
Python 3.1.1 문자열을 16 진수로


답변

파이썬에는 따옴표로 묶은 인쇄 가능 (7 비트 ASCII에 적합), base64 (영숫자에 적합), 16 진수 이스케이프 처리, gzip 및 bz2 압축과 같은 편리한 변환을 수행하는 바이트-바이트 표준 코덱 이 있습니다. Python 2에서는 다음을 수행 할 수 있습니다.

b'foo'.encode('hex')

파이썬 3에서 str.encode/ bytes.decode는 bytes <-> str 변환을위한 것입니다. 대신 파이썬 2와 파이썬 3에서 작동하는이 작업을 수행 할 수 있습니다 (역 의 경우 s / encode / decode / g ).

import codecs
codecs.getencoder('hex')(b'foo')[0]

Python 3.4부터는 덜 어색한 옵션이 있습니다.

codecs.encode(b'foo', 'hex')

이러한 기타 코덱은 자체 모듈 (base64, zlib, bz2, uu, quopri, binascii) 내에서도 액세스 할 수 있습니다. API는 일관성이 떨어지지 만 압축 코덱의 경우 더 많은 제어 기능을 제공합니다.


답변

import codecs
codecs.getencoder('hex_codec')(b'foo')[0]

Python 3.3에서 작동합니다 ( “hex”대신 “hex_codec”).


답변

이 메소드 binascii.hexlify()는 ASCII 16 진 문자열을 나타내는 로 변환 bytes됩니다 bytes. 즉, 입력의 각 바이트가 두 개의 ASCII 문자로 변환됩니다. 당신이 진실을 원한다면 결과 str를 얻을 수 .decode("ascii")있습니다.

나는 그것을 보여주는 스 니펫을 포함시켰다.

import binascii

with open("addressbook.bin", "rb") as f: # or any binary file like '/bin/ls'
    in_bytes = f.read()
    print(in_bytes) # b'\n\x16\n\x04'
    hex_bytes = binascii.hexlify(in_bytes)
    print(hex_bytes) # b'0a160a04' which is twice as long as in_bytes
    hex_str = hex_bytes.decode("ascii")
    print(hex_str) # 0a160a04

육각 문자열에서 "0a160a04"받는 돌아올 수에 bytesbinascii.unhexlify("0a160a04")있는 등을 제공합니다b'\n\x16\n\x04'


답변

좋아, 다음 답변은 Python 3에만 관심이 있다면 범위를 약간 벗어 났지만이 질문은 Python 버전을 지정하지 않아도 Google이 처음으로 맞은 문제이므로 Python 2 Python 3 모두에서 작동하는 방법이 있습니다. .

또한 바이트를 str유형으로 변환하는 것에 대한 질문을 해석하고 있습니다 . 즉, Python 2에서는 bytes-y, Python 3에서는 Unicode-y입니다.

내가 아는 가장 좋은 방법은 다음과 같습니다.

import six

bytes_to_hex_str = lambda b: ' '.join('%02x' % i for i in six.iterbytes(b))

Python 2에서 unicode_literals미래를 활성화하지 않았다고 가정하면 Python 2 또는 Python 3에 대해 다음 어설 션이 적용됩니다 .

assert bytes_to_hex_str(b'jkl') == '6a 6b 6c'

또는 ''.join()바이트 등의 공백을 생략하는 데 사용할 수 있습니다 .


답변

%x0216 진수 값을 형식화하고 출력하는 형식 지정자 를 사용할 수 있습니다 . 예를 들면 다음과 같습니다.

>>> foo = b"tC\xfc}\x05i\x8d\x86\x05\xa5\xb4\xd3]Vd\x9cZ\x92~'6"
>>> res = ""
>>> for b in foo:
...     res += "%02x" % b
...
>>> print(res)
7443fc7d05698d8605a5b4d35d56649c5a927e2736