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 0
Bu ö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 int
dö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
int
inferTemel olarak 0 int
iletirseniz, dizeyi öneki önekinden çıkarır.
>>> int(string_1, 0)
65535
Onaltılık öneki olmadan 0x
, int
tahmin 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
eval
saç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ışı 256
değil 100
ve print(c)
irade çıkışı 100
değil 256
. Ayrıca, c
bunun bir dize olduğunu unutmayın , ancak a
cevabı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
.