Преобразование шестнадцатеричной строки в int в Python - PullRequest
659 голосов
/ 16 октября 2008

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

У меня может быть это "0xffff" или просто "ffff".

Ответы [ 10 ]

941 голосов
/ 16 октября 2008

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

x = int("deadbeef", 16)

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

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

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

144 голосов
/ 16 октября 2008

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

>>> int("a", 16)
10
>>> int("0xa",16)
10
44 голосов
/ 16 октября 2008

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

int(s, 16)
27 голосов
/ 14 мая 2016

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

У меня это может быть "0xffff" или просто "ffff".

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

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

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

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

11 голосов
/ 30 июня 2012

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

print int(0xdeadbeef) # valid

myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
4 голосов
/ 17 января 2014

Наихудший путь:

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

>>> hex_to_int("c0ffee")
12648430

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

Является ли использование eval в Python плохой практикой?

2 голосов
/ 19 октября 2018

или ast.literal_eval (это безопасно, в отличие от eval):

ast.literal_eval("0xffff")

Демо-версия:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 
1 голос
/ 16 мая 2015

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

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

>>a = int('deadbeef',16)
>>float(a)
3735928559.0
1 голос
/ 22 июня 2013

Параметр форматирования "% 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 голосов
/ 21 августа 2012

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

Например

>>a='0xff'
>>eval(a)
255
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...