Como converter um int em uma string hexadecimal?

210

Eu quero levar um número inteiro (que será <= 255), para uma representação de cadeia hexadecimal

por exemplo: eu quero 65entrar e sair '\x41'ou 255sair '\xff'.

Eu tentei fazer isso com o struct.pack('c',65 ), mas isso se complica com qualquer coisa acima, 9pois ele deseja incluir uma única sequência de caracteres.

pynoob
fonte

Respostas:

214

Você está procurando a chrfunção.

Você parece estar misturando representações decimais de números inteiros e hexadecimais de números inteiros; portanto, não está totalmente claro o que você precisa. Com base na descrição que você forneceu, acho que um desses trechos mostra o que você deseja.

>>> chr(0x65) == '\x65'
True


>>> hex(65)
'0x41'
>>> chr(65) == '\x41'
True

Observe que isso é bem diferente de uma string que contém um número inteiro como hexadecimal . Se é isso que você deseja, use o hexbuilt-in.

Mike Graham
fonte
2
Eu pensei que chr converteu números inteiros para ascii. Nesse caso, chr (65) = 'A'. Esta é uma nova adição?
precisa saber é o seguinte
2
@diedthreetimes, chrnão envolve ASCII, simplesmente pega um número e cria uma bytestring de um byte, onde o valor ordinal do byte é o número. As codificações ASCII e compatíveis com ASCII entram em jogo quando você escreve e exibe seqüências de caracteres.
Mike Graham
1
@diedthreetimes, por exemplo, eles aparecem criando 'A'outra maneira de escrever e exibir '\x41'. O que strrealmente importa é o fato de ter sessenta e cinco anos. Para tornar as coisas compreensíveis e utilizáveis por seres humanos, que muitas vezes torna-se um A.
Mike Graham
134

Isso converterá um número inteiro em uma sequência hexadecimal de 2 dígitos com o prefixo 0x:

strHex = "0x%0.2X" % 255
Greg Bray
fonte
2
Sugiro editar o código aqui e alterá-lo para este: strHex = "0x% 0.2X"% integerVariable. (Eu não era capaz de me editar.)
Samuel
58

Que tal hex()?

hex(255)  # 0xff

Se você realmente quer ter \na frente, pode:

print '\\' + hex(255)[1:]
Felix Kling
fonte
repr(chr(255)) # '\xff'também consegue isso
Glenn 'devalias' 15/06/16
43

Experimentar:

"0x%x" % 255 # => 0xff

ou

"0x%X" % 255 # => 0xFF

A documentação do Python diz: "mantenha isso debaixo do seu travesseiro: http://docs.python.org/library/index.html "

Dawid
fonte
31

Deixe-me adicionar este, porque às vezes você quer apenas a representação de um dígito:

'{:x}'.format(15)
> f

E agora com as novas f''seqüências de formato que você pode fazer:

f'{15:x}'
> f

NOTA: o 'f' inicial f'{15:x}'é para significar uma string de formato

monkut
fonte
Para referência sobre este recurso puro, PEP 498 - literal de cadeia de interpolação
MFT
1
IMHO, um pouco mais "legível" opção pode ser '0x {: X}'. Formato (15) (aviso X está em maiúsculas). Para 2034, imprimirá 0x7F2 em vez de 7f2
Pavel Sapehin
11

Se você deseja compactar uma estrutura com um valor <255 (um byte não assinado, uint8_t) e terminar com uma sequência de um caractere, provavelmente está procurando o formato B em vez de c . C converte um caractere em uma string (não muito útil por si só) enquanto B converte um número inteiro.

struct.pack('B', 65)

(E sim, 65 é \ x41, não \ x65.)

A classe struct também manipulará convenientemente endianness para comunicação ou outros usos.

XTL
fonte
A quantidade de tempo que levei para encontrar o struct.pack ('B', <integer>) é impressionante. Obrigado.
Sean D.
7

Observe que, para valores grandes, hex()ainda funciona (algumas outras respostas não):

x = hex(349593196107334030177678842158399357)
print(x)

Python 2: 0x4354467b746f6f5f736d616c6c3f7dL
Python 3:0x4354467b746f6f5f736d616c6c3f7d

Para uma mensagem RSA descriptografada, pode-se fazer o seguinte:

import binascii

hexadecimals = hex(349593196107334030177678842158399357)

print(binascii.unhexlify(hexadecimals[2:-1])) # python 2
print(binascii.unhexlify(hexadecimals[2:])) # python 3
Luc
fonte
5

Isso funcionou melhor para mim

"0x%02X" % 5  # => 0x05
"0x%02X" % 17 # => 0x11

Altere (2) se desejar um número com uma largura maior (2 é para 2 caracteres hexadecimais), para que 3 forneça o seguinte

"0x%03X" % 5  # => 0x005
"0x%03X" % 17 # => 0x011
shakram02
fonte
3

Eu queria um número inteiro aleatório convertido em uma seqüência hexadecimal de seis dígitos com um # no início. Para conseguir isso eu usei

"#%6x" % random.randint(0xFFFFFF)
ncmathsadist
fonte
6
Suponho que você quis dizer "#%6x" % random.randint(0x0, 0xFFFFFF). (Há uma falta %antes 6e randintleva 2 parâmetros BAIXOS e bounds- superior)
pacha
5
deve ser% 06x, se você não quer espaços
Janus Troelsen
3

Com format(), conforme exemplos de formato , podemos fazer:

>>> # format also supports binary numbers
>>> "int: {0:d};  hex: {0:x};  oct: {0:o};  bin: {0:b}".format(42)
'int: 42;  hex: 2a;  oct: 52;  bin: 101010'
>>> # with 0x, 0o, or 0b as prefix:
>>> "int: {0:d};  hex: {0:#x};  oct: {0:#o};  bin: {0:#b}".format(42)
'int: 42;  hex: 0x2a;  oct: 0o52;  bin: 0b101010'
Mapa
fonte
2
(int_variable).to_bytes(bytes_length, byteorder='big'|'little').hex()

Por exemplo:

>>> (434).to_bytes(4, byteorder='big').hex()
'000001b2'
>>> (434).to_bytes(4, byteorder='little').hex()
'b2010000'
Chengcheng Zhang
fonte
1

Além disso, você pode converter qualquer número em qualquer base para hexadecimal. Use este código de uma linha aqui, é fácil e simples de usar:

hex(int(n,x)).replace("0x","")

Você tem uma string nque é o seu número e x a base desse número. Primeiro, altere-o para inteiro e, em seguida, para hexadecimal, mas o hexadecimal é 0xo primeiro a ser replaceremovido.

Izak Sensei
fonte
-1

Como uma representação alternativa, você poderia usar

[in] '%s' % hex(15)
[out]'0xf'
uzumaki
fonte