Python'da hex dizesini int'e dönüştür


764

Python'da bir hex dizesini int'e nasıl dönüştürebilirim?

" 0xffff" Veya sadece " ffff" olarak alabilirim.

Yanıtlar:


1086

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


25
Yani ikinci argüman olarak daima 16 kullanmalısınız. Açık, örtük olmaktan iyidir.
Bachsau

13
@bachsau, açıkça doğru değil. Kullanıcı girişini okumak isterseniz, onaltılık veya ondalık girişe izin verirseniz, hangisi kullanıcı için uygunsa?
Dan Lenski

7
Tamam, şunu söylemeliydim: Bu özel durumda! Orijinal soru "Onaltılık bir dizeyi nasıl dönüştürebilirim ..." idi. Kullanıcıya bırakmak istiyorsanız, daha kullanışlı bir özelliktir, haklısınızdır.
Bachsau

@DanLenski, her zaman onaltılık dizeleri pozitif sayılara dönüştürür. int("FFFF",16)-1'e dönüştürülmek istiyorum .
Nazar

@Nazar uzun zaman oldu, bu yüzden bu noktada sizin için muhtemelen yararlı değil, ancak ikinin tamamlayıcı kurallarını uygulamak gerekiyorsa, burada tökezleyen herkes için yararlıdır. Bu yanıt stackoverflow.com/questions/1604464/twos-complement-in-python
Jeremy

163

int(hexString, 16) hile yapar ve 0x öneki ile ve olmadan çalışır:

>>> int("a", 16)
10
>>> int("0xa",16)
10


43

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

Letting intinfer

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

değişmezleri:

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.


Yinelemeye değer "int infer'e izin verme Temel olarak 0 değerini iletirseniz, int, dizedeki önekten tabanı çıkarır." Nasıl onaltılık veya ondalık (veya ikili) tamsayı python yorumlayıcı olarak dönüştürmek için.
gaoithe

13

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

5

En kötü yol:

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

>>> hex_to_int("c0ffee")
12648430

Lütfen bunu yapma!

Python'da eval kullanmak kötü bir uygulama mıdır?


3
Bununla ilgili evalsaçma bir şekilde yavaş olduğunu, diğer tüm sorunların üstünde olduğunu belirtmek gerekir.
j6m8

4
Bu kötü bir fikirse, onu ortaya çıkarmanın anlamı nedir?
pppery

3
İyi bir nokta. Kısmen komik olduğunu düşünüyorum ve kısmen de üretim kodunda gördüğüm için.
André Laszlo

Ben muhtemelen 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.
Tcll

1
i komik ve aydınlatıcı buldum, ben yayınlanmıştır sevindim
frogeyedpeas

3

Veya ast.literal_eval(bu güvenli, aksine eval):

ast.literal_eval("0xffff")

Demo:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 

1

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

Yorumlar yanlış. 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).
André Laszlo

Girişiniz için teşekkürler, cevabımın doğru olmadığını kabul ediyorum ve şimdi düzelttim. Ancak cevabın bir kısmının, int (string, base) kullanarak yukarıda olduğu gibi gereksiz olduğunu fark ediyorum, ancak yine de cevabın geri kalanı yazıya daha fazla seçenek eklediğine inanıyorum. Katılıyorum ?
Soundararajan

İlgili değil; Bu, taban 16'dan baz 10'a dönüştürmekle ilgili, başka bir yol değil
pppery

1

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

1

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)

-1

Python 2.7'de int('deadbeef',10)işe yaramıyor gibi görünüyor.

Aşağıdakiler benim için çalışıyor:

>>a = int('deadbeef',16)
>>float(a)
3735928559.0

4
Bu soruya nasıl cevap veriyor?
pppery

-5

'0x' önekiyle eval fonksiyonunu da kullanabilirsiniz

Örneğin

>>a='0xff'
>>eval(a)
255

16
Eval kullanıyorsanız giriş doğrulamasının doğru yapıldığından emin olun. Aslında, muhtemelen daha iyi bir yol var. Eval kullanmayın.
ALOToverflow

7
En azından kullanmalısınız ast.literal_eval.
Andy Hayden

2
Ayrıca çok yavaş. En kötü yol.
Tõnu Samuel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.