Eu tenho essa string: Hello world !!
e quero imprimi-la usando Python como 48:65:6c:6c:6f:20:77:6f:72:6c:64:20:21:21
.
hex()
funciona apenas para números inteiros.
Como pode ser feito?
python
string
hex
ordinal-indicator
Eduard Florinescu
fonte
fonte
str
ou Python 3bytestring
), pois não há transformação inequívoca de um caractere em um número inteiro de 0 a 255. Assim, as cadeias de caracteres (Python 2unicode
e Python 3str
) primeiro requerem alguma codificação antes de serem conversíveis neste formato hexadecimal. A resposta de Aaron Hall exemplifica isso.Respostas:
Você pode transformar sua string em um gerador int, aplicar formatação hexadecimal para cada elemento e intercalar com separador:
fonte
str
como hex não faz muito sentido; convém imprimir obytes
objeto como hexadecimal (converterstr
parabytes
chamando.encode()
).":".join("{:02x}".format(ord(c)) for c in 'løl')
retorna'6c:f8:6c'
, enquanto":".join("{:02x}".format(c) for c in 'løl'.encode())
produz a representação correta do utf-8'6c:c3:b8:6c'
.":".join("{:04x}".format(ord(c)) for c in s)
(substituindo02x
com04x
a zero-pad cada número a ser 4 dígitos) em vezWARNING: Calling str(pkt) on Python 3 makes no sense!
fonte
h = binascii.hexlify(b"Hello world !!") to get hex string. b":".join(h[i:i+2] for i in range(0, len(h), 2))
para inserir':'
após cada dois dígitos hexadecimais.LookupError: 'hex' is not a text encoding; use codecs.encode() to handle arbitrary codecs
Para Python 2.x:
O código acima não funcionará com o Python 3.x , para 3.x, o código abaixo funcionará:
fonte
Outra resposta em duas linhas que alguns podem achar mais fáceis de ler e ajuda na depuração de quebras de linha ou outros caracteres estranhos em uma sequência:
Para Python 2.7
Para Python 3.7 (não testado em todas as versões 3)
fonte
codecs.encode(<bytestring>, "hex")
funciona, no entanto.import sys
;s="Déjà vu Besançon,Lupiñén,Šiauliai,Großräschen,Łódź,Аша,广东省,LA"
;for c in s:
;w=sys.stdout.write(c+":"+c.encode('utf-8').hex()+"||")
; (out)D:44||é:c3a9||j:6a||à:c3a0|| :20||v:76||u:75|| :20||B:42||e:65||s:73||a:61||n:6e||ç:c3a7||o:6f||n:6e||,:2c||L:4c||u:75||p:70||i:69||ñ:c3b1||é:c3a9||n:6e||,:2c||Š:c5a0||i:69||a:61||u:75||l:6c||i:69||a:61||i:69||,:2c||G:47||r:72||o:6f||ß:c39f||r:72||ä:c3a4||s:73||c:63||h:68||e:65||n:6e||,:2c||Ł:c581||ó:c3b3||d:64||ź:c5ba||,:2c||А:d090||ш:d188||а:d0b0||,:2c||广:e5b9bf||东:e4b89c||省:e79c81||,:2c||L:4c||A:41||
Alguns complementos à resposta de Fedor Gogolev:
Primeiro, se a string contiver caracteres cujo 'código ASCII' esteja abaixo de 10, eles não serão exibidos conforme necessário. Nesse caso, o formato correto deve ser
{:02x}
:Segundo, se a sua "string" é na realidade uma "string de bytes" - e como a diferença importa no Python 3 - você pode preferir o seguinte:
Observe que não há necessidade de conversão no código acima, pois um objeto bytes é definido como "uma sequência imutável de números inteiros no intervalo 0 <= x <256" .
fonte
A resposta aceita fornece:
retorna:
A resposta aceita funciona apenas desde que você use bytes (principalmente caracteres ascii). Mas se você usa unicode, por exemplo:
Você precisa converter para bytes de alguma forma.
Se o seu terminal não aceitar esses caracteres, você poderá decodificar a partir de UTF-8 ou usar os nomes (para colar e executar o código comigo):
Então vemos que:
retorna
um resultado ruim / inesperado - esses são os pontos de código que se combinam para criar os grafemas que vemos no Unicode, do Unicode Consortium - representando idiomas em todo o mundo. Isso é não como realmente armazenar essas informações para que possa ser interpretada por outras fontes, no entanto.
Para permitir que outra fonte use esses dados, geralmente precisamos converter para codificação UTF-8, por exemplo, para salvar essa string em bytes no disco ou publicar em html. Portanto, precisamos dessa codificação para converter os pontos de código nas unidades de código de UTF-8 - no Python 3,
ord
não é necessária porquebytes
são iteráveis de números inteiros:Ou talvez de forma mais elegante, usando as novas strings f (disponíveis apenas no Python 3):
No Python 2, passe
c
para oord
primeiro, ou seja,ord(c)
- mais exemplos:fonte
Você pode usar
hexdump
's(acrescente
.lower()
se você precisar de letras minúsculas). Isso funciona para o Python 2 e 3.fonte
pip install -U hexdump --proxy http://proxy.address:port
sudo
compip
que erreipacman
...O uso da função map e lambda pode produzir uma lista de valores hexadecimais, que podem ser impressos (ou usados para outros fins)
fonte
[hex(ord(c)) for c in s]
Isso pode ser feito das seguintes maneiras:
A saída disso será em hexadecimal da seguinte maneira:
fonte
__future__
é uma biblioteca padrão disponível nas versões recentes do Python 2 que pode ser usada para criar recursos normalmente apenas no Python 3 compatível com versões anteriores. Nesta resposta, é usado para obter oprint(text)
recurso "função de impressão", que substitui aprint text
sintaxe do Python 2. Consulte os documentos do Python .Um pouco mais geral para quem não se importa com Python3 ou dois pontos:
fonte
Usando
base64.b16encode
em python2 (embutido)fonte
.decode()
?Apenas por conveniência, muito simples.
fonte
para algo que oferece mais desempenho do que
''.format()
, você pode usar o seguinte:desculpe, isso não poderia parecer melhor,
seria bom se alguém pudesse simplesmente fazê-lo
'%02x'%v
, mas isso leva apenas int ...mas você ficará preso a cadeias de bytes
b''
sem a lógica para selecionarord(v)
.fonte