Respostas:
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 0
como base para invocar esse comportamento de adivinhação de prefixo; omitir o segundo parâmetro significa assumir a base 10.)
int("FFFF",16)
ser convertido para -1.
int(hexString, 16)
faz o truque e trabalha com e sem o prefixo 0x:
>>> int("a", 16)
10
>>> int("0xa",16)
10
Para qualquer string s:
int(s, 16)
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 int
junto 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
int
inferirSe você passar 0 como base, int
inferirá a base do prefixo na cadeia.
>>> 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'
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á ffff
porque 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.
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
A pior maneira:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
eval
também é absurdamente lento, além de todos os outros problemas.
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.
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
print(b)
produzirá 256
, não 100
e print(c)
produzirá 100
, não 256
. Observe também que c
é uma string, mas a
não é assim que sua resposta realmente converte um int em uma string, e não o contrário (é disso que se trata a pergunta).
Se você estiver usando o interpretador python, basta digitar 0x (seu valor hexadecimal) e o intérprete o converterá automaticamente para você.
>>> 0xffff
65535
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)
com o prefixo '0x', você também pode usar a função eval
Por exemplo
>>a='0xff'
>>eval(a)
255
ast.literal_eval
.