Antworten:
Ohne das Präfix 0x müssen Sie die Basis explizit angeben, andernfalls können Sie nicht sagen:
x = int("deadbeef", 16)
Mit dem Präfix 0x kann Python Hex und Dezimal automatisch unterscheiden.
>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10
(Sie müssen0
als Basis angeben , um dieses Verhalten beim Erraten von Präfixen aufzurufen. Wenn Sie den zweiten Parameter weglassen, wird die Basis 10 angenommen.)
int("FFFF",16)
in -1 konvertiert werden.
int(hexString, 16)
macht den Trick und arbeitet mit und ohne das Präfix 0x:
>>> int("a", 16)
10
>>> int("0xa",16)
10
Für eine bestimmte Zeichenfolge s:
int(s, 16)
Konvertieren Sie Hex-Zeichenfolgen in Python in int
Ich kann es als
"0xffff"
oder nur haben"ffff"
.
Um eine Zeichenfolge in eine int zu konvertieren, übergeben Sie die Zeichenfolge int
zusammen mit der Basis, von der Sie konvertieren.
Beide Zeichenfolgen reichen für die Konvertierung auf folgende Weise aus:
>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535
int
inferWenn Sie 0 als Basis übergeben, int
wird die Basis aus dem Präfix in der Zeichenfolge abgeleitet.
>>> int(string_1, 0)
65535
Ohne den hexadezimalen Präfix 0x
, int
nicht genügend Informationen , mit denen zu erraten:
>>> int(string_2, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'
Wenn Sie in Quellcode oder einen Interpreter eingeben, führt Python die Konvertierung für Sie durch:
>>> integer = 0xffff
>>> integer
65535
Dies funktioniert nicht, ffff
da Python denkt, dass Sie stattdessen versuchen, einen legitimen Python-Namen zu schreiben:
>>> integer = ffff
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined
Python-Zahlen beginnen mit einem numerischen Zeichen, während Python-Namen nicht mit einem numerischen Zeichen beginnen können.
Hinzu kommt zu Dans Antwort oben: Wenn Sie die Funktion int () mit einer Hex-Zeichenfolge versehen, müssen Sie die Basis als 16 angeben, da Sie sonst nicht glauben, dass Sie ihr einen gültigen Wert gegeben haben. Die Angabe der Basis 16 ist für Hex-Zahlen, die nicht in Zeichenfolgen enthalten sind, nicht erforderlich.
print int(0xdeadbeef) # valid
myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
Der schlimmste Weg:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
Ist die Verwendung von eval in Python eine schlechte Praxis?
eval
neben all den anderen Problemen auch absurd langsam ist.
int(s,16)
Rückgabe falscher Werte aufgetreten sind, die einige Hauptprobleme mit meiner Laufzeit verursacht haben ( int(hex(value),16) == int(value) >>> False
). Die an übergebene Zeichenfolge eval()
war sicher und der zurückgegebene Wert war korrekt.
Oder ast.literal_eval
(dies ist im Gegensatz zu sicher eval
):
ast.literal_eval("0xffff")
Demo:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
Die Formatierungsoption '% x'% scheint auch in Zuweisungsanweisungen für mich zu funktionieren. (Angenommen, Python 3.0 und höher)
Beispiel
a = int('0x100', 16)
print(a) #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100
print(b)
wird ausgeben 256
, nicht 100
und print(c)
wird ausgeben 100
, nicht 256
. Beachten Sie auch, dass dies c
eine Zeichenfolge ist, aber a
nicht so, dass Ihre Antwort tatsächlich ein int in eine Zeichenfolge konvertiert, nicht umgekehrt (darum geht es in der Frage).
Wenn Sie den Python-Interpreter verwenden, können Sie einfach 0x (Ihren Hex-Wert) eingeben und der Interpreter konvertiert ihn automatisch für Sie.
>>> 0xffff
65535
Behandelt Hex, Oktal, Binär, Int und Float
Unter Verwendung der Standardpräfixe (dh 0x, 0b, 0 und 0o) konvertiert diese Funktion jede geeignete Zeichenfolge in eine Zahl. Ich habe dies hier beantwortet: https://stackoverflow.com/a/58997070/2464381, aber hier ist die benötigte Funktion.
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)
Mit dem Präfix '0x' können Sie auch die Auswertungsfunktion verwenden
Zum Beispiel
>>a='0xff'
>>eval(a)
255
ast.literal_eval
.