Jawaban:
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 0
sebagai basis untuk menjalankan perilaku menebak-awalan ini; menghilangkan parameter kedua berarti mengasumsikan basis-10.)
int("FFFF",16)
dikonversi menjadi -1.
int(hexString, 16)
melakukan trik, dan bekerja dengan dan tanpa awalan 0x:
>>> int("a", 16)
10
>>> int("0xa",16)
10
Untuk string apa saja yang diberikan:
int(s, 16)
Konversi string hex ke int di Python
Saya mungkin memilikinya sebagai
"0xffff"
atau adil"ffff"
.
Untuk mengonversi string menjadi int, sampaikan string tersebut int
bersama 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
int
menyimpulkanJika Anda melewatkan 0 sebagai basis, int
akan menyimpulkan basis dari awalan dalam string.
>>> int(string_1, 0)
65535
Tanpa awalan heksadesimal, 0x
, int
tidak 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'
Jika Anda mengetikkan kode sumber atau juru bahasa, Python akan melakukan konversi untuk Anda:
>>> integer = 0xffff
>>> integer
65535
Ini tidak akan berhasil ffff
karena 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.
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
Cara terburuk:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
Apakah menggunakan eval di Python merupakan praktik yang buruk?
eval
juga lambat bukan kepalang, di atas semua masalah lain dengan itu.
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.
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
print(b)
akan menampilkan 256
, tidak 100
dan print(c)
akan menampilkan 100
, bukan 256
. Perhatikan juga bahwa c
ini adalah string, tetapi a
tidak demikian dengan jawaban Anda yang benar-benar mengubah int menjadi string, bukan sebaliknya (inilah pertanyaannya).
Jika Anda menggunakan interpreter python, Anda cukup mengetik 0x (nilai hex Anda) dan interpreter akan mengonversinya secara otomatis untuk Anda.
>>> 0xffff
65535
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)
dengan awalan '0x', Anda mungkin juga menggunakan fungsi eval
Sebagai contoh
>>a='0xff'
>>eval(a)
255
ast.literal_eval
.