Odpowiedzi:
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ć 0
jako zasady w celu powołania tego prefiksu odgadnięcie zachowań; pomijając drugie środki parametrów założyć bazę-10).
int("FFFF",16)
przekonwertować na -1.
Dla dowolnego podanego ciągu s:
int(s, 16)
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 int
wraz 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
int
wnioskowaćJeśli podasz 0 jako podstawę, int
wyprowadzisz podstawę z przedrostka w ciągu.
>>> int(string_1, 0)
65535
Bez prefiksu szesnastkowym 0x
, int
nie 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'
Jeśli wpisujesz kod źródłowy lub interpreter, Python dokona dla Ciebie konwersji:
>>> integer = 0xffff
>>> integer
65535
To nie zadziała, ffff
ponieważ 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.
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
Najgorszy sposób:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
eval
jest to również absurdalnie wolne, oprócz wszystkich innych problemów z tym związanych.
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.
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
>>>
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
print(b)
będzie generować 256
, nie 100
i print(c)
będzie generować 100
, nie 256
. Zauważ też, że c
jest to ciąg znaków, ale a
nie jest tak, że twoja odpowiedź faktycznie przekształca liczbę całkowitą w ciąg, a nie na odwrót (o to chodzi w pytaniu).
Jeśli używasz interpretera python, możesz po prostu wpisać 0x (wartość szesnastkową), a interpreter przekonwertuje go automatycznie.
>>> 0xffff
65535
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)
z prefiksem „0x” możesz także użyć funkcji eval
Na przykład
>>a='0xff'
>>eval(a)
255
ast.literal_eval
.