Преобразование шестнадцатеричной строки в int в Python

510

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

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

Теги:
string
hex

10 ответов

774
Лучший ответ

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

x = int("deadbeef", 16)

С префикс 0x, Python может отличать hex и decimal автоматически.

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

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

  • 12
    Это означает, что вы всегда должны использовать 16 в качестве второго аргумента. Явное лучше, чем неявное.
  • 4
    @ bachsau, явно не соответствует действительности. Что если вы хотите прочитать пользовательский ввод, разрешив ввод в шестнадцатеричном или десятичном виде, в зависимости от того, что удобно для пользователя?
Показать ещё 1 комментарий
123

int(hexString, 16) выполняет трюк и работает с префиксом 0x и без него:

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

Для любой заданной строки s:

int(s, 16)
12

Преобразование шестнадцатеричной строки в int в Python

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

Чтобы преобразовать строку в int, передайте строку в int вместе с базой, из которой вы конвертируете.

Обе строки будут достаточными для преобразования следующим образом:

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

Предоставление int infer

Если вы передадите 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 не могут начинаться с числового символа.

  • 2
    Наиболее полный ответ
11

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

print int(0xdeadbeef) # valid

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

Худший способ:

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

>>> hex_to_int("c0ffee")
12648430

Пожалуйста, не делайте этого!

Использует ли eval в Python плохую практику?

  • 3
    Стоит отметить, что eval также абсурдно медленен, помимо всех других проблем с ним.
  • 2
    Если это плохая идея, то какой смысл ее поднимать?
Показать ещё 2 комментария
1

В Python 2.7, int('deadbeef',10), похоже, не работает.

Для меня работает следующее:

>>a = int('deadbeef',16)
>>float(a)
3735928559.0
  • 3
    Как это отвечает на вопрос?
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
  • 0
    Комментарии неверны. print(b) выведет 256 , а не 100 а print(c) выведет 100 , а не 256 . Также обратите внимание, что c - это строка, но a не так, что ваш ответ на самом деле преобразует int в строку, а не наоборот (вот о чем вопрос).
  • 0
    Спасибо за ваш вклад, я согласен, что мой ответ не правильный, и теперь я исправил это. Однако я понимаю, что часть ответа избыточна, как указано выше, то есть использует int (string, base), но, тем не менее, остальная часть ответа добавляет больше возможностей к сообщению, я полагаю. Согласен ?
Показать ещё 1 комментарий
-4

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

Например

>>a='0xff'
>>eval(a)
255
  • 14
    Убедитесь, что проверка ввода выполнена правильно, если используется eval. На самом деле, вероятно, есть лучший способ. Не используйте eval.
  • 5
    По крайней мере, вы должны использовать ast.literal_eval .
Показать ещё 1 комментарий
-5

Чтобы преобразовать DWORD из шестнадцатеричного числа в целое число со знаком, выполните два дополнения следующим образом:

~ (0xffffffff - int('0xdeadbeef', 16)) + 1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню