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

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


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


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.


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

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?


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

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

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

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)

-1

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

Berikut ini berfungsi untuk saya:

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

4
Bagaimana ini menjawab pertanyaan?
pppery

-5

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

Sebagai contoh

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.