Konversi string hex ke int di Python

766

Bagaimana cara mengkonversi string hex ke int di Python?

Saya mungkin memilikinya sebagai " 0xffff" atau hanya " ffff".

Mat
sumber

Jawaban:

1087

Tanpa awalan 0x, Anda perlu menentukan basis secara eksplisit, jika tidak, tidak ada cara untuk mengatakan:

x = int("deadbeef", 16)

Dengan awalan 0x, Python dapat membedakan hex dan desimal secara otomatis.

>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10

(Anda harus menentukan 0sebagai basis untuk menjalankan perilaku menebak-awalan ini; menghilangkan parameter kedua berarti mengasumsikan basis-10.)

Dan Lenski
sumber
25
Yang berarti Anda harus selalu menggunakan 16 sebagai argumen kedua. Eksplisit lebih baik daripada implisit.
Bachsau
13
@bachsau, jelas tidak benar. Bagaimana jika Anda ingin membaca input pengguna, yang memungkinkan input dalam hex atau desimal, mana yang nyaman bagi pengguna?
Dan Lenski
7
Ok, saya seharusnya mengatakan: Dalam kasus khusus ini! Pertanyaan aslinya adalah "Bagaimana cara saya mengkonversi string hex ...". Jika Anda ingin menyerahkannya kepada pengguna, itu adalah fitur yang berguna, dengan itu Anda benar.
Bachsau
@ DanLenski, selalu mengubah string hex ke angka positif. Saya ingin int("FFFF",16)dikonversi menjadi -1.
Nazar
@Nazar sudah lama, jadi ini mungkin tidak berguna bagi Anda pada saat ini, tetapi bagi siapa pun yang tersandung di sini, jika menerapkan aturan pelengkap keduanya diperlukan. Jawaban ini dapat membantu stackoverflow.com/questions/1604464/twos-complement-in-python
Jeremy
163

int(hexString, 16) melakukan trik, dan bekerja dengan dan tanpa awalan 0x:

>>> int("a", 16)
10
>>> int("0xa",16)
10
beristirahat
sumber
47

Untuk string apa saja yang diberikan:

int(s, 16)
Jorge Ferreira
sumber
43

Konversi string hex ke int di Python

Saya mungkin memilikinya sebagai "0xffff"atau adil "ffff".

Untuk mengonversi string menjadi int, sampaikan string tersebut intbersama dengan basis tempat Anda konversi.

Kedua string akan cukup untuk konversi dengan cara ini:

>>> string_1 = "0xffff"
>>> string_2 = "ffff"
>>> int(string_1, 16)
65535
>>> int(string_2, 16)
65535

Membiarkan intmenyimpulkan

Jika Anda melewatkan 0 sebagai basis, intakan menyimpulkan basis dari awalan dalam string.

>>> int(string_1, 0)
65535

Tanpa awalan heksadesimal, 0x, inttidak memiliki informasi yang cukup yang dapat digunakan untuk menebak:

>>> int(string_2, 0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 0: 'ffff'

literal:

Jika Anda mengetikkan kode sumber atau juru bahasa, Python akan melakukan konversi untuk Anda:

>>> integer = 0xffff
>>> integer
65535

Ini tidak akan berhasil ffffkarena Python akan berpikir Anda mencoba untuk menulis nama Python yang sah sebagai gantinya:

>>> integer = ffff
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ffff' is not defined

Bilangan Python dimulai dengan karakter numerik, sedangkan nama Python tidak bisa dimulai dengan karakter numerik.

Aaron Hall
sumber
Layak diulangi "Membiarkan int menyimpulkan Jika Anda melewatkan 0 sebagai basis, int akan menyimpulkan basis dari awalan dalam string." Bagaimana mengkonversi dari heksadesimal atau desimal (atau biner) ke integer seperti yang dilakukan oleh interpreter python.
gaoithe
13

Menambahkan ke jawaban Dan di atas: jika Anda menyediakan fungsi int () dengan string hex, Anda harus menentukan basis sebagai 16 atau tidak akan berpikir Anda memberikannya nilai yang valid. Menentukan basis 16 tidak perlu untuk angka heks yang tidak terkandung dalam string.

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
Maks
sumber
5

Cara terburuk:

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

>>> hex_to_int("c0ffee")
12648430

Tolong jangan lakukan ini!

Apakah menggunakan eval di Python merupakan praktik yang buruk?

André Laszlo
sumber
3
Perlu dicatat bahwa evaljuga lambat bukan kepalang, di atas semua masalah lain dengan itu.
j6m8
4
Jika ini adalah ide yang buruk, lalu apa gunanya membawanya?
pppery
3
Poin yang bagus. Sebagian karena saya pikir itu lucu dan sebagian karena saya sudah melihatnya dalam kode produksi.
André Laszlo
Saya mungkin harus mencatat bahwa saya biasa melakukan ini setelah mengalami masalah dengan int(s,16)mengembalikan nilai yang tidak tepat, menyebabkan beberapa masalah utama dengan runtime saya ( int(hex(value),16) == int(value) >>> False). string yang dipasok ke eval()aman dan nilai yang dikembalikan tepat.
Tcll
1
saya menemukan ini lucu dan mencerahkan, saya senang itu diposting
frogeyedpeas
3

Atau ast.literal_eval(ini aman, tidak seperti eval):

ast.literal_eval("0xffff")

Demo:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 
U10-Maju
sumber
1

Opsi formatter '% x'% tampaknya berfungsi dalam pernyataan penugasan juga untuk saya. (Dengan asumsi Python 3.0 dan yang lebih baru)

Contoh

a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100
Soundararajan
sumber
Komentarnya salah. print(b)akan menampilkan 256, tidak 100dan print(c)akan menampilkan 100, bukan 256. Perhatikan juga bahwa cini adalah string, tetapi atidak demikian dengan jawaban Anda yang benar-benar mengubah int menjadi string, bukan sebaliknya (inilah pertanyaannya).
André Laszlo
Terima kasih atas masukan Anda, saya setuju bahwa jawaban saya tidak benar, dan sekarang saya telah memperbaikinya. Namun saya menyadari bahwa bagian dari jawaban itu berlebihan seperti di atas yaitu menggunakan int (string, base), tetapi tetap saja jawabannya menambahkan lebih banyak opsi untuk posting, saya percaya. Setuju?
Soundararajan
Tidak berhubungan; ini tentang mengubah dari basis 16 ke basis 10, bukan sebaliknya
pppery
1

Jika Anda menggunakan interpreter python, Anda cukup mengetik 0x (nilai hex Anda) dan interpreter akan mengonversinya secara otomatis untuk Anda.

>>> 0xffff

65535
Maysara Alhindi
sumber
1

Menangani hex, oktal, biner, int, dan float

Menggunakan awalan standar (mis. 0x, 0b, 0, dan 0o) fungsi ini akan mengonversi string apa pun yang cocok menjadi angka. Saya menjawab ini di sini: https://stackoverflow.com/a/58997070/2464381 tetapi di sini adalah fungsi yang diperlukan.

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)
shrewmouse
sumber
-1

Dalam Python 2.7, int('deadbeef',10)sepertinya tidak berfungsi.

Berikut ini berfungsi untuk saya:

>>a = int('deadbeef',16)
>>float(a)
3735928559.0
Avi2503
sumber
4
Bagaimana ini menjawab pertanyaan?
pppery
-5

dengan awalan '0x', Anda mungkin juga menggunakan fungsi eval

Sebagai contoh

>>a='0xff'
>>eval(a)
255
Junjie
sumber
16
Pastikan validasi input dilakukan dengan benar jika menggunakan eval. Bahkan, mungkin ada cara yang lebih baik. Jangan gunakan eval.
ALOToverflow
7
Paling tidak Anda harus menggunakan ast.literal_eval.
Andy Hayden
2
Juga sangat lambat. Cara terburuk yang pernah ada.
T Samuelnu Samuel