Konwertuj ciąg szesnastkowy na int w Pythonie

764

Jak przekonwertować ciąg szesnastkowy na int w Pythonie?

Mogę to mieć jako „ 0xffff” lub po prostu „ ffff”.

Matt
źródło

Odpowiedzi:

1086

Bez przedrostka 0x musisz jawnie określić bazę, w przeciwnym razie nie będzie można powiedzieć:

x = int("deadbeef", 16)

Za pomocą przedrostka 0x Python może automatycznie rozróżniać liczby szesnastkowe i dziesiętne.

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

(Ty musi określić 0jako zasady w celu powołania tego prefiksu odgadnięcie zachowań; pomijając drugie środki parametrów założyć bazę-10).

Dan Lenski
źródło
25
Co oznacza, że ​​zawsze powinieneś używać 16 jako drugiego argumentu. Jawne jest lepsze niż niejawne.
Bachsau
13
@bachsau, oczywiście nieprawda. Co zrobić, jeśli chcesz odczytać dane wprowadzane przez użytkownika, pozwalając na wprowadzanie danych w systemie szesnastkowym lub dziesiętnym, w zależności od tego, co jest wygodne dla użytkownika?
Dan Lenski
7
Ok, powinienem był powiedzieć: w tym konkretnym przypadku! Pierwotne pytanie brzmiało: „Jak przekonwertować ciąg szesnastkowy…”. Jeśli chcesz zostawić to użytkownikowi, to jest to przydatna funkcja, z tym masz rację.
Bachsau,
@ DanLenski, zawsze konwertuje ciągi szesnastkowe na liczby dodatnie. Chcę int("FFFF",16)przekonwertować na -1.
Nazar
@Nazar minęło sporo czasu, więc prawdopodobnie nie jest to przydatne w tym momencie, ale dla każdego, kto potknie się tutaj, jeśli wymagane jest zastosowanie dwóch zasad uzupełniania. Ta odpowiedź może pomóc stackoverflow.com/questions/1604464/twos-complement-in-python
Jeremy
163

int(hexString, 16) wykonuje lewę i działa z prefiksem 0x i bez niego:

>>> int("a", 16)
10
>>> int("0xa",16)
10
rozwijać
źródło
47

Dla dowolnego podanego ciągu s:

int(s, 16)
Jorge Ferreira
źródło
43

Konwertuj ciąg szesnastkowy na int w Pythonie

Mogę to mieć jako "0xffff"lub po prostu "ffff".

Aby przekonwertować ciąg na liczbę int, przekaż ciąg intwraz z bazą, z której konwertujesz.

Oba ciągi wystarczą do konwersji w ten sposób:

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

Pozwolić intwnioskować

Jeśli podasz 0 jako podstawę, intwyprowadzisz podstawę z przedrostka w ciągu.

>>> int(string_1, 0)
65535

Bez prefiksu szesnastkowym 0x, intnie ma wystarczająco dużo informacji, z którym do odgadnięcia:

>>> int(string_2, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'

literały:

Jeśli wpisujesz kod źródłowy lub interpreter, Python dokona dla Ciebie konwersji:

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

To nie zadziała, ffffponieważ Python pomyśli, że zamiast tego próbujesz napisać prawidłową nazwę Python:

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

Liczby w języku Python zaczynają się od znaku numerycznego, a nazwy w języku Python nie mogą zaczynać się od znaku numerycznego.

Aaron Hall
źródło
Warto powtórzyć „Pozwalając int wywnioskować Jeśli podasz 0 jako podstawę, int wyprowadzi podstawę z prefiksu w ciągu”. Jak przekonwertować z szesnastkowej lub dziesiętnej (lub binarnej) na liczbę całkowitą, tak jak robi to interpreter Pythona.
gaoithe,
13

Dodając do powyższej odpowiedzi Dana: jeśli podasz funkcję int () ciągiem szesnastkowym, będziesz musiał określić bazę jako 16 lub nie będzie myśleć, że podałeś jej prawidłową wartość. Określenie podstawy 16 nie jest konieczne w przypadku liczb szesnastkowych nie zawartych w ciągach.

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
Max
źródło
5

Najgorszy sposób:

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

>>> hex_to_int("c0ffee")
12648430

Proszę nie rób tego!

Czy używanie eval w Pythonie jest złą praktyką?

André Laszlo
źródło
3
Warto zauważyć, że evaljest to również absurdalnie wolne, oprócz wszystkich innych problemów z tym związanych.
j6m8,
4
Jeśli to zły pomysł, jaki jest sens jego poruszania?
pppery
3
Słuszna uwaga. Częściowo dlatego, że uważam to za zabawne, a częściowo dlatego, że widziałem to w kodzie produkcyjnym.
André Laszlo,
Powinienem chyba zauważyć, że robiłem to po wystąpieniu problemów ze int(s,16)zwracaniem niewłaściwych wartości, powodując pewne poważne problemy z moim środowiskiem wykonawczym ( int(hex(value),16) == int(value) >>> False). podany ciąg znaków eval()był bezpieczny, a zwrócona wartość była poprawna.
Tcll
1
uznałem
3

Lub ast.literal_eval(w przeciwieństwie do tego jest bezpieczne eval):

ast.literal_eval("0xffff")

Próbny:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 
U10 do przodu
źródło
1

Wydaje mi się, że opcja formatera „% x”% działa również w instrukcjach przypisania. (Zakładając, że Python 3.0 i nowszy)

Przykład

a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100
Soundararajan
źródło
Komentarze są niepoprawne. print(b)będzie generować 256, nie 100i print(c)będzie generować 100, nie 256. Zauważ też, że cjest to ciąg znaków, ale anie jest tak, że twoja odpowiedź faktycznie przekształca liczbę całkowitą w ciąg, a nie na odwrót (o to chodzi w pytaniu).
André Laszlo,
Dziękuję za pański wkład, zgadzam się, że moja odpowiedź jest nieprawidłowa i teraz ją naprawiłem. Jednak zdaję sobie sprawę, że część odpowiedzi jest zbędna, jak powyżej, tj. Używając int (ciąg, podstawa), ale nadal reszta odpowiedzi dodaje więcej opcji do postu, jak sądzę. Zgodzić się ?
Soundararajan,
Nieistotne; chodzi o konwersję z bazy 16 na bazę 10, a nie na odwrót
pppery
1

Jeśli używasz interpretera python, możesz po prostu wpisać 0x (wartość szesnastkową), a interpreter przekonwertuje go automatycznie.

>>> 0xffff

65535
Maysara Alhindi
źródło
1

Obsługuje hex, octal, binary, int i float

Korzystając ze standardowych prefiksów (tj. 0x, 0b, 0 i 0o), funkcja przekształci dowolny odpowiedni ciąg na liczbę. Odpowiedziałem na to tutaj: https://stackoverflow.com/a/58997070/2464381, ale tutaj jest potrzebna funkcja.

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)
ryjówka
źródło
-1

W Pythonie 2.7 int('deadbeef',10)wydaje się nie działać.

Poniższe działa dla mnie:

>>a = int('deadbeef',16)
>>float(a)
3735928559.0
Avi2503
źródło
4
Jak to odpowiada na pytanie?
pppery
-5

z prefiksem „0x” możesz także użyć funkcji eval

Na przykład

>>a='0xff'
>>eval(a)
255
Junjie
źródło
16
Upewnij się, że sprawdzanie poprawności danych wejściowych zostało wykonane poprawnie, jeśli używasz eval. W rzeczywistości istnieje prawdopodobnie lepszy sposób. Nie używaj eval.
ALOToverflow
7
Na samym przynajmniej powinien być używany ast.literal_eval.
Andy Hayden
2
Również bardzo wolno. Najgorszy sposób w historii.
Tõnu Samuel