Konvertieren Sie Hex-Zeichenfolgen in Python in int


764

Wie konvertiere ich eine Hex-Zeichenfolge in Python in ein Int?

Ich kann es als " 0xffff" oder nur " ffff" haben.

Antworten:


1086

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.)


25
Das heißt, Sie sollten immer 16 als zweites Argument verwenden. Explizit ist besser als implizit.
Bachsau

13
@Bachsau, eindeutig falsch. Was ist, wenn Sie Benutzereingaben lesen möchten und Eingaben in hexadezimaler oder dezimaler Form zulassen möchten, je nachdem, was für den Benutzer günstig ist?
Dan Lenski

7
Ok, ich hätte sagen sollen: In diesem speziellen Fall! Die ursprüngliche Frage lautete "Wie konvertiere ich eine Hex-Zeichenfolge ...". Wenn Sie es dem Benutzer überlassen möchten, dann ist es eine nützliche Funktion, damit haben Sie Recht.
Bachsau

@DanLenski konvertiert immer Hex-Strings in positive Zahlen. Ich möchte int("FFFF",16)in -1 konvertiert werden.
Nazar

@Nazar es ist lange her, daher ist dies an dieser Stelle wahrscheinlich nicht nützlich für Sie, aber für alle anderen, die hier vorbeikommen, wenn die Anwendung der beiden Komplementregeln erforderlich ist. Diese Antwort kann helfen, stackoverflow.com/questions/1604464/twos-complement-in-python
Jeremy

163

int(hexString, 16) macht den Trick und arbeitet mit und ohne das Präfix 0x:

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


43

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

Letting intinfer

Wenn 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'

Literale:

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.


Es lohnt sich zu wiederholen: "Int ableiten lassen Wenn Sie 0 als Basis übergeben, leitet int die Basis aus dem Präfix in der Zeichenfolge ab." So konvertieren Sie wie ein Python-Interpreter von hexadezimal oder dezimal (oder binär) in eine Ganzzahl.
Gaoithe

13

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

5

Der schlimmste Weg:

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

>>> hex_to_int("c0ffee")
12648430

Bitte tu das nicht!

Ist die Verwendung von eval in Python eine schlechte Praxis?


3
Es ist erwähnenswert, dass dies evalneben all den anderen Problemen auch absurd langsam ist.
j6m8

4
Wenn dies eine schlechte Idee ist, was bringt es dann, sie zur Sprache zu bringen?
pppery

3
Guter Punkt. Teilweise, weil ich es lustig finde und teilweise, weil ich es im Produktionscode gesehen habe.
André Laszlo

Ich sollte wahrscheinlich beachten, dass ich dies früher getan habe, nachdem Probleme mit der 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.
Tcll

1
Ich fand das lustig und aufschlussreich,
ich bin

3

Oder ast.literal_eval(dies ist im Gegensatz zu sicher eval):

ast.literal_eval("0xffff")

Demo:

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

1

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

Die Kommentare sind falsch. 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).
André Laszlo

Vielen Dank für Ihre Eingabe, ich stimme zu, dass meine Antwort nicht richtig ist, und jetzt habe ich es behoben. Ich erkenne jedoch, dass ein Teil der Antwort wie oben redundant ist, dh int (Zeichenfolge, Basis) verwendet, aber der Rest der Antwort fügt dem Beitrag meiner Meinung nach mehr Optionen hinzu. Zustimmen ?
Soundararajan

Nicht relevant; Hier geht es darum, von Basis 16 auf Basis 10 zu konvertieren, nicht umgekehrt
pppery

1

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

1

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)

-1

In Python 2.7 int('deadbeef',10)scheint nicht zu funktionieren.

Folgendes funktioniert für mich:

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

4
Wie beantwortet dies die Frage?
pppery

-5

Mit dem Präfix '0x' können Sie auch die Auswertungsfunktion verwenden

Zum Beispiel

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

16
Stellen Sie sicher, dass die Eingabevalidierung korrekt durchgeführt wird, wenn Sie eval verwenden. In der Tat gibt es wahrscheinlich einen besseren Weg. Verwenden Sie eval nicht.
ALOToverflow

7
Ganz am wenigsten Sie verwenden sollten ast.literal_eval.
Andy Hayden

2
Auch sehr langsam. Der schlimmste Weg überhaupt.
Tõnu Samuel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.