Qual é a maneira correta de converter bytes em uma string hexadecimal no Python 3?
Vejo reivindicações de um bytes.hex
método, bytes.decode
codecs e tentei outras funções possíveis de menor espanto, sem sucesso. Eu só quero meus bytes como hexadecimal!
python
python-3.x
hex
Matt Joiner
fonte
fonte
Respostas:
Desde o Python 3.5, isso finalmente não é mais complicado:
e inverter:
funciona também com o
bytearray
tipo mutável .Referência: https://docs.python.org/3/library/stdtypes.html#bytes.hex
fonte
bytes.fromhex()
também está disponível no Python 3.0+ (não apenas 3.5+).bytes.hex()
está disponível apenas no Python 3.5+.Use o
binascii
módulo:Veja esta resposta: Python 3.1.1 string to hex
fonte
str
mas abytes
. Eu sei que o OP parece feliz com a resposta, mas não vai ser melhor para expandir esta resposta para incluir.decode("ascii")
também para convertê-lo em um "string"bytes
. Se vocêprint(b'666f6f')
receberb
a impressão. Se você,.decode("ascii")
então você não. Apenas pensando em como aqueles que realmente tinham umbytes
(binário verdadeiro com itens> 128, não uma string ascii) queriam imprimi-lo..hex()
método no Python 3.5+O Python possui codecs padrão de bytes em bytes que executam transformações convenientes como quoted-printable (cabe em 7bits ascii), base64 (cabe em alfanuméricos), escape hexadecimal, compressão gzip e bz2. No Python 2, você pode fazer:
No Python 3,
str.encode
/bytes.decode
são estritamente para conversões de bytes <-> str. Em vez disso, você pode fazer isso, que funciona no Python 2 e Python 3 ( s / encode / decode / g para o inverso):Começando com o Python 3.4, existe uma opção menos complicada:
Esses codecs variados também são acessíveis dentro de seus próprios módulos (base64, zlib, bz2, uu, quopri, binascii); a API é menos consistente, mas para codecs de compactação oferece mais controle.
fonte
LookupError: unknown encoding: hex
binascii.hexlify(b'foo')
diretamentefunciona em Python 3.3 (então "hex_codec" em vez de "hex").
fonte
O método
binascii.hexlify()
será convertidobytes
em umbytes
representando a cadeia hexadecimal ascii. Isso significa que cada byte na entrada será convertido em dois caracteres ascii. Se você quer umastr
saída verdadeira , pode obter.decode("ascii")
o resultado.Eu incluí um trecho que ilustra isso.
da cadeia hexadecimal
"0a160a04"
para pode voltar para obytes
com obinascii.unhexlify("0a160a04")
qual devolveb'\n\x16\n\x04'
fonte
OK, a resposta a seguir é um pouco além do escopo se você se importa apenas com o Python 3, mas esta pergunta é a primeira ocorrência do Google, mesmo que você não especifique a versão do Python, então aqui está uma maneira de funcionar tanto no Python 2 quanto no Python 3 .
Também estou interpretando a questão de converter bytes para o
str
tipo: ou seja, bytes-y no Python 2 e Unicode-y no Python 3.Dado isso, a melhor abordagem que conheço é:
A afirmação a seguir será verdadeira para Python 2 ou Python 3, supondo que você não tenha ativado o
unicode_literals
futuro no Python 2:(Ou você pode usar
''.join()
para omitir o espaço entre os bytes etc.)fonte
pode ser usado o especificador de
%x02
formato que formata e gera um valor hexadecimal. Por exemplo:fonte
res.upper()
Novo no python 3.8, você pode passar um argumento delimitador para a
hex
função, como neste exemplohttps://docs.python.org/3/library/stdtypes.html#bytes.hex
fonte
Se você deseja converter b '\ x61' em 97 ou '0x61', tente o seguinte:
Referência: https://docs.python.org/3.5/library/struct.html
fonte