Конвертировать шестнадцатеричную строку в int в Python


767

Как мне преобразовать шестнадцатеричную строку в int в Python?

Я могу иметь это как " 0xffff" или просто " ffff".

Ответы:


1088

Без префикса 0x вам нужно явно указать базу, иначе нет способа сказать:

x = int("deadbeef", 16)

С префиксом 0x Python может различать шестнадцатеричное и десятичное автоматически.

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

(Вы должны указать 0в качестве основы, чтобы вызвать это поведение угадывания префиксов; пропустить второй параметр означает принять base-10.)


25
Это означает, что вы всегда должны использовать 16 в качестве второго аргумента. Явное лучше, чем неявное.
Бахсау

14
@ bachsau, явно не соответствует действительности. Что если вы хотите прочитать пользовательский ввод, разрешив ввод в шестнадцатеричном или десятичном виде, в зависимости от того, что удобно для пользователя?
Дэн Ленски

7
Хорошо, я должен был сказать: в этом конкретном случае! Первоначальный вопрос был «Как мне преобразовать шестнадцатеричную строку…». Если вы хотите оставить это пользователю, то это полезная функция, с которой вы правы.
Бахсау

@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 не могут начинаться с цифры.


Стоит повторить «Letting int infer Если вы передадите 0 в качестве базы, int выведет базу из префикса в строке». Как преобразовать шестнадцатеричное или десятичное (или двоичное) в целое число, как это делает интерпретатор Python.
19

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

Обрабатывает hex, восьмеричный, двоичный, 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
Как это отвечает на вопрос?
17

-5

с префиксом «0x» вы также можете использовать функцию eval

Например

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

16
Убедитесь, что проверка ввода выполнена правильно, если используется eval. На самом деле, вероятно, есть лучший способ. Не используйте eval.
ALOToverflow

7
По крайней мере, вы должны использовать ast.literal_eval.
Энди Хейден

2
Также очень медленно. Худший способ когда-либо.
Тыну Самуэль
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.