Pergunta

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

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

Foi útil?

Solução

Sem o 0 x prefixo, você precisa especificar a base explicitamente, caso contrário, não há nenhuma maneira de dizer:

x = int("deadbeef", 16)

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

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

(Você deve especificar 0 como a base, a fim de chamar esse comportamento de adivinhação de prefixo;. Omitindo o segundo meio de parâmetros para assumir base-10)

Outras dicas

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

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

Para qualquer string s:

int(s, 16)

string Convert hex para int em Python

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

Para converter uma string para um int, passar a seqüência de int juntamente com a base que você está convertendo a partir.

Ambas as cordas será suficiente para a conversão da seguinte maneira:

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

Deixando int inferir

Se você passar 0 como base, int irá inferir a base do prefixo da string.

>>> int(string_1, 0)
65535

Sem o prefixo hexadecimal, 0x, int nã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ê está digitando em código-fonte ou um intérprete, Python vai fazer a conversão para você:

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

Isto não trabalho com ffff porque Python vai pensar que você está tentando escrever um nome Python legítimo em vez disso:

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

números Python começar com um caractere numérico, enquanto nomes Python não pode começar com um caractere numérico.

Somando-se a resposta de Dan acima: se você fornecer a função int () com uma string hex, você terá que especificar a base como 16 ou ele não vai pensar que você deu a ele um valor válido. Especificando base 16 é desnecessária para números hexadecimais não contidos no strings.

print int(0xdeadbeef) # valid

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

A pior maneira:

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

>>> hex_to_int("c0ffee")
12648430

Por favor, não faça isso!

está usando eval em Python uma má prática?

Ou ast.literal_eval (isso é seguro, ao contrário eval):

ast.literal_eval("0xffff")

Demonstração:

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

Em Python 2.7, int('deadbeef',10) não parece trabalho.

Os seguintes trabalhos para mim:

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

A opção formatador '% x' % parece funcionar em instruções de atribuição, bem como para mim. (Assumindo Python 3,0 e mais tarde)

Exemplo

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

Se você estiver usando o interpretador Python, você pode simplesmente digitar 0x (o seu valor hexadecimal) e o intérprete irá convertê-lo automaticamente para você.

>>> 0xffff

65535

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

Por exemplo

>>a='0xff'
>>eval(a)
255
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top