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

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


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


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.


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

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ą?


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


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

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

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

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)

-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

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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.