Converter string hexadecimal em int em Python


766

Como faço para converter uma string hex em int em Python?

Eu posso tê-lo como " 0xffff" ou apenas " ffff".

Respostas:


1087

Sem o prefixo 0x, você precisa especificar a base explicitamente, caso contrário, não há como saber:

x = int("deadbeef", 16)

Com o prefixo 0x, o Python pode distinguir hex e decimal automaticamente.

>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10

(Você deve especificar 0como base para invocar esse comportamento de adivinhação de prefixo; omitir o segundo parâmetro significa assumir a base 10.)


25
O que significa que você deve sempre usar 16 como o segundo argumento. Explícito é melhor que implícito.
Bachsau 13/01/19

13
@bachsau, claramente falso. E se você quiser ler a entrada do usuário, permitindo a entrada em hexadecimal ou decimal, o que for mais conveniente para o usuário?
precisa saber é o seguinte

7
Ok, eu deveria ter dito: Nesse caso em particular! A pergunta original era "Como converter uma string hexadecimal ...". Se você deseja deixá-lo para o usuário, esse é um recurso útil, com o qual você está certo.
Bachsau 13/01/19

@ DanLenski, sempre converte seqüências hexadecimais em números positivos. Eu quero int("FFFF",16)ser convertido para -1.
Nazar

O @Nazar já faz muito tempo, então isso provavelmente não é útil para você neste momento, mas para qualquer pessoa que tropeçar por aqui, se for necessário aplicar as regras de complemento dos dois. Esta resposta pode ajudar stackoverflow.com/questions/1604464/twos-complement-in-python
Jeremy

163

int(hexString, 16) faz o truque e trabalha com e sem o prefixo 0x:

>>> int("a", 16)
10
>>> int("0xa",16)
10


43

Converter string hexadecimal em int em Python

Eu posso tê-lo como "0xffff"ou apenas "ffff".

Para converter uma string em um int, passe a string para intjunto com a base da qual você está convertendo.

Ambas as strings serão suficientes para a conversão desta maneira:

>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535

Deixar intinferir

Se você passar 0 como base, intinferirá a base do prefixo na cadeia.

>>> int(string_1, 0)
65535

Sem o prefixo hexadecimal, 0x, intnão tem informação suficiente com que adivinhar:

>>> int(string_2, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'

literais:

Se você estiver digitando o código-fonte ou um intérprete, o Python fará a conversão para você:

>>> integer = 0xffff
>>> integer
65535

Isso não funcionará ffffporque o Python pensará que você está tentando escrever um nome legítimo em Python:

>>> integer = ffff
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined

Os números do Python começam com um caractere numérico, enquanto os nomes do Python não podem começar com um caractere numérico.


Vale a pena repetir "Deixando int inferir Se você passar 0 como base, int inferirá a base do prefixo na string". Como converter de hexadecimal ou decimal (ou binário) para número inteiro, como faz o intérprete python.
gaoithe

13

Acrescentando à resposta de Dan acima: se você fornecer a função int () com uma sequência hexadecimal, terá que especificar a base como 16 ou não achará que deu um valor válido. A especificação da base 16 é desnecessária para números hexadecimais não contidos em cadeias.

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid

5

A pior maneira:

>>> def hex_to_int(x):
    return eval("0x" + x)

>>> hex_to_int("c0ffee")
12648430

Por favor, não faça isso!

Usar o eval no Python é uma má prática?


3
Vale a pena notar que evaltambém é absurdamente lento, além de todos os outros problemas.
J6m8

4
Se essa é uma má idéia, qual é o sentido de trazê-la à tona?
pppery

3
Bom ponto. Em parte porque acho engraçado e em parte porque vi isso no código de produção.
André Laszlo

Provavelmente, devo observar que costumava fazer isso depois de ter problemas com o int(s,16)retorno de valores impróprios, causando alguns problemas importantes no meu tempo de execução ( int(hex(value),16) == int(value) >>> False). a cadeia fornecida eval()era segura e o valor retornado era adequado.
Tcll 14/06/19

1
Eu achei isso engraçado e esclarecedor, estou feliz que tenha sido postado
frogeyedpeas

3

Ou ast.literal_eval(isso é seguro, diferente eval):

ast.literal_eval("0xffff")

Demo:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 

1

A opção do formatador '% x'% parece funcionar em declarações de atribuição também para mim. (Assumindo o Python 3.0 e posterior)

Exemplo

a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100

Os comentários estão incorretos. print(b)produzirá 256, não 100e print(c)produzirá 100, não 256. Observe também que cé uma string, mas anão é assim que sua resposta realmente converte um int em uma string, e não o contrário (é disso que se trata a pergunta).
André Laszlo

Obrigado pela sua contribuição, concordo que minha resposta não está correta e agora eu a corrigi. No entanto, eu percebo que parte da resposta é redundante como acima, ou seja, usando int (string, base), mas ainda assim o restante da resposta adiciona mais opções ao post, acredito. Aceita ?
Soundararajan

Não é relevante; trata-se de conversão de base 16 para base 10, não o contrário
pppery

1

Se você estiver usando o interpretador python, basta digitar 0x (seu valor hexadecimal) e o intérprete o converterá automaticamente para você.

>>> 0xffff

65535

1

Lida com hex, octal, binário, int e float

Usando os prefixos padrão (ou seja, 0x, 0b, 0 e 0o), esta função converterá qualquer string adequada em um número. Eu respondi isso aqui: https://stackoverflow.com/a/58997070/2464381, mas aqui está a função necessária.

def to_number(n):
    ''' Convert any number representation to a number 
    This covers: float, decimal, hex, and octal numbers.
    '''

    try:
        return int(str(n), 0)
    except:
        try:
            # python 3 doesn't accept "010" as a valid octal.  You must use the
            # '0o' prefix
            return int('0o' + n, 0)
        except:
            return float(n)

-1

No Python 2.7, int('deadbeef',10) parece não funcionar.

O seguinte funciona para mim:

>>a = int('deadbeef',16)
>>float(a)
3735928559.0

4
Como isso responde à pergunta?
pppery

-5

com o prefixo '0x', você também pode usar a função eval

Por exemplo

>>a='0xff'
>>eval(a)
255

16
Certifique-se de que a validação de entrada seja feita corretamente se estiver usando eval. De fato, provavelmente existe uma maneira melhor. Não use eval.
ALOToverflow

7
No mínimo, você deve estar usando ast.literal_eval.
Andy Hayden

2
Também é muito lento. Pior caminho de sempre.
Tõnu Samuel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.