Перетворити шістнадцяткову рядок в int в Python


764

Як перетворити шістнадцяткову рядок в int в Python?

У мене це може бути " 0xffff" або просто " ffff".

Відповіді:


1086

Без префікса 0x вам потрібно чітко вказати базу, інакше немає способу сказати:

x = int("deadbeef", 16)

За допомогою префікса 0x Python може автоматично розрізняти шістнадцятковий і десятковий.

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

(Ви повинні вказати 0як базу, щоб викликати цю поведінку відгадування префікса; пропуск другого параметра означає припустити базу-10.)


25
Що означає, що ви завжди повинні використовувати 16 як другий аргумент. Явне краще, ніж неявне.
Бахсау

13
@bachsau, явно неправда. Що робити, якщо ви хочете прочитати дані користувача, дозволяючи вводити шістнадцятковий або десятковий характер, що зручно для користувача?
Дан Ленскі

7
Гаразд, я мав би сказати: У цьому конкретному випадку! Первісне питання було "Як перетворити шістнадцяткову рядок ...". Якщо ви хочете залишити це користувачеві, ніж це корисна функція, ви маєте рацію.
Bachsau

@DanLenski, він завжди перетворює шістнадцяткові рядки в додатні числа. Я хочу int("FFFF",16)перетворити на -1.
Назар

@Nazar це вже давно, тому це, мабуть, не корисно для вас на даний момент, але для всіх, хто наткнеться сюди, якщо потрібно застосовувати два правила доповнення. Ця відповідь може допомогти stackoverflow.com/questions/1604464/twos-complement-in-python
Джеремі

163

int(hexString, 16) робить фокус, і працює з префіксом 0x і без нього:

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


43

Перетворити шістнадцяткову рядок в int в Python

Я можу мати його як "0xffff"або просто "ffff".

Щоб перетворити рядок у int, передайте рядок intразом із базою, з якої перетворюєте.

Обох рядків буде достатньо для перетворення таким чином:

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

Давати intвисновок

Якщо ви передасте 0 як базову, intвиведемо підставу з префікса в рядку.

>>> int(string_1, 0)
65535

Без префікса шістнадцятирічного, 0x, intне має достатньо інформації , з допомогою якої вгадати:

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

літерали:

Якщо ви вводите вихідний код або інтерпретатор, Python здійснить перетворення для вас:

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

З цим не вийде, ffffтому що Python подумає, що ви намагаєтесь написати законне ім'я Python замість цього:

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

Номери Python починаються з числового символу, тоді як імена Python не можуть починатися з числового символу.


Варто повторити "Введення int infer Якщо ви передасте 0 в якості основи, int виведе основу з префікса в рядку." Як перетворити з шістнадцяткових чи десяткових (або двійкових) цілих чисел, як це робить інтерпретатор python.
gaoithe

13

Додавши до відповіді Дана вище: якщо ви надаєте функцію int () шістнадцяткову рядок, вам доведеться вказати базову як 16, або вона не подумає, що ви дали їй дійсне значення. Вказання бази 16 не є необхідним для шістнадцяткових чисел, що не містяться у рядках.

print int(0xdeadbeef) # valid

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

5

Найгірший спосіб:

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

>>> hex_to_int("c0ffee")
12648430

Будь ласка, не робіть цього!

Чи є використання eval в Python поганою практикою?


3
Варто зазначити, що evalце також абсурдно повільно, крім усіх інших питань, пов'язаних із цим.
j6m8

4
Якщо це погана ідея, то в чому сенс її виховувати?
pppery

3
Гарна думка. Почасти тому, що я думаю, що це смішно, а почасти тому, що я бачив це у виробничому коді.
Андре Ласло

Я, мабуть, повинен зауважити, що раніше я робив це, коли виникали проблеми з int(s,16)поверненням неправильних значень, що спричиняло деякі основні проблеми з моїм виконанням ( int(hex(value),16) == int(value) >>> False). рядок, що постачається, eval()був безпечним, а повернене значення було належним.
Tcll

1
Я вважав це смішним і освічуючим, я радий, що це було розміщено
frogeyedpeas

3

Або ast.literal_eval(це безпечно, на відміну від eval):

ast.literal_eval("0xffff")

Демонстрація:

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

1

Опція форматування '% x'%, здається, працює і в операторах призначення. (Припускаючи Python 3.0 та новіших версій)

Приклад

a = int('0x100', 16)
print(a)   #256
print('%x' % a) #100
b = a
print(b) #256
c = '%x' % a
print(c) #100

Зауваження невірні. print(b)буде виводити 256, не, 100і print(c)буде виводити 100, ні 256. Також зауважте, що cце рядок, але aце не так, що ваша відповідь фактично перетворює int у рядок, а не навпаки (саме про це йдеться).
Андре Ласло

Дякую за ваш внесок, я погоджуюсь, що моя відповідь невірна, і тепер я виправив її. Однак я усвідомлюю, що частина відповіді є зайвою, як зазначено вище, тобто з використанням int (string, base), але все ж решта відповіді додає більше варіантів до публікації, я вважаю. Погодьтеся?
Soundararajan

Не стосується; мова йде про перетворення з бази 16 на базу 10, а не навпаки
pppery

1

Якщо ви використовуєте інтерпретатор python, ви можете просто ввести 0x (ваше шістнадцяткове значення), і інтерпретатор перетворить його автоматично для вас.

>>> 0xffff

65535

1

Обробляє шістнадцяткові, восьмеричні, двійкові, int та float

Використовуючи стандартні префікси (тобто 0x, 0b, 0 і 0o), ця функція перетворить будь-який відповідний рядок у число. Я відповів на це тут: https://stackoverflow.com/a/58997070/2464381, але ось необхідна функція.

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, int('deadbeef',10)схоже, не працює.

Наступні роботи для мене:

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

4
Як це відповідає на питання?
pppery

-5

з префіксом "0x" ви також можете використовувати функцію eval

Наприклад

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

16
Переконайтесь, що перевірка вводу виконана правильно, якщо використовується eval. Насправді, мабуть, кращий спосіб. Не використовуйте eval.
ALOToverflow

7
По крайней мере, вам слід користуватися ast.literal_eval.
Енді Хайден

2
Також дуже повільно. Найгірший спосіб.
Tõnu Samuel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.