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 intzusammen 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
intinferWenn Sie 0 als Basis übergeben, intwird die Basis aus dem Präfix in der Zeichenfolge abgeleitet.
>>> int(string_1, 0)
65535
Ohne den hexadezimalen Präfix 0x, intnicht 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, ffffda 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?
evalneben 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 100und print(c)wird ausgeben 100, nicht 256. Beachten Sie auch, dass dies ceine Zeichenfolge ist, aber anicht 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.