Yanıtlar:
0x öneki olmadan , tabanı açıkça belirtmeniz gerekir, aksi takdirde bunu söylemenin bir yolu yoktur:
x = int("deadbeef", 16)
İle 0x öneki, Python otomatik onaltılık ve ondalık ayırt edebilir.
>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10
(Sen gerekir belirtmek 0Bu önek tahmin davranışını çağırmak için üs olarak; tabanını-10 varsaymak ikinci parametre aracı atlayarak.)
int("FFFF",16)-1'e dönüştürülmek istiyorum .
Herhangi bir dize için:
int(s, 16)
Python'da hex dizesini int'e dönüştür
Ben de öyle
"0xffff"ya da böyle olabilir"ffff".
Bir dizeyi int'e dönüştürmek için, dizeyi intdönüştürdüğünüz tabanla birlikte iletin.
Her iki dizge de bu şekilde dönüşüm için yeterli olacaktır:
>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535
intinferTemel olarak 0 intiletirseniz, dizeyi öneki önekinden çıkarır.
>>> int(string_1, 0)
65535
Onaltılık öneki olmadan 0x, inttahmin etmek yeterli bilgiye sahip değildir:
>>> int(string_2, 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'
Kaynak koduna veya bir tercümana yazıyorsanız, Python dönüşümü sizin için yapar:
>>> integer = 0xffff
>>> integer
65535
Bu işe yaramaz ffffçünkü Python bunun yerine meşru bir Python adı yazmaya çalıştığınızı düşünecektir:
>>> integer = ffff
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined
Python numaraları sayısal bir karakterle başlarken, Python adları sayısal bir karakterle başlayamaz.
Yukarıdaki Dan'ın cevabına ek olarak: int () işlevine bir hex dizesi sağlarsanız, tabanı 16 olarak belirtmeniz gerekir veya geçerli bir değer verdiğinizi düşünmez. Dizede bulunmayan onaltılık sayılar için taban 16 belirtilmesi gerekmez.
print int(0xdeadbeef) # valid
myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
En kötü yol:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
evalsaçma bir şekilde yavaş olduğunu, diğer tüm sorunların üstünde olduğunu belirtmek gerekir.
int(s,16)benim runtime ( int(hex(value),16) == int(value) >>> False) ile bazı önemli sorunlara neden, yanlış değerleri döndürme ile ilgili sorunlar yaşadıktan sonra bunu yapmak için not etmeliyim . sağlanan dize eval()güvenli ve döndürülen değer uygun.
'% X'% biçimlendirici seçeneği, atama ifadelerinde de benim için çalışıyor gibi görünüyor. (Python 3.0 ve üstünü varsayarsak)
Misal
a = int('0x100', 16)
print(a) #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100
print(b)irade çıkışı 256değil 100ve print(c)irade çıkışı 100değil 256. Ayrıca, cbunun bir dize olduğunu unutmayın , ancak acevabınız aslında int'i bir dizeye dönüştürür, tersi değil (sorunun ne olduğu budur).
Python yorumlayıcı kullanıyorsanız, sadece 0x (onaltılık değeriniz) yazabilirsiniz ve yorumlayıcı sizin için otomatik olarak dönüştürür.
>>> 0xffff
65535
Onaltılı, sekizli, ikili, int ve float ile baş eder
Standart önekleri (ör. 0x, 0b, 0 ve 0o) kullanarak bu işlev herhangi bir uygun dizeyi sayıya dönüştürür. Bunu burada cevapladım: https://stackoverflow.com/a/58997070/2464381 ama gerekli fonksiyon burada.
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)
'0x' önekiyle eval fonksiyonunu da kullanabilirsiniz
Örneğin
>>a='0xff'
>>eval(a)
255
ast.literal_eval.