Ответы:
Без префикса 0x вам нужно явно указать базу, иначе нет способа сказать:
x = int("deadbeef", 16)
С префиксом 0x Python может различать шестнадцатеричное и десятичное автоматически.
>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10
(Вы должны указать 0
в качестве основы, чтобы вызвать это поведение угадывания префиксов; пропустить второй параметр означает принять base-10.)
int("FFFF",16)
быть преобразованным в -1.
Для любой заданной строки s:
int(s, 16)
Конвертировать шестнадцатеричную строку в 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 () шестнадцатеричную строку, вам нужно будет указать базу как 16, иначе она не будет думать, что вы дали ей правильное значение. Указание базы 16 не требуется для шестнадцатеричных чисел, не содержащихся в строках.
print int(0xdeadbeef) # valid
myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
Худший способ:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
eval
это также абсурдно медленно, вдобавок ко всем другим проблемам с ним.
int(s,16)
возвратом неправильных значений, что вызывало некоторые серьезные проблемы с моей средой выполнения ( int(hex(value),16) == int(value) >>> False
). предоставленная строка eval()
была безопасной, а возвращаемое значение было правильным.
Или ast.literal_eval
(это безопасно, в отличие от eval
):
ast.literal_eval("0xffff")
Демо-версия:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
Параметр форматирования "% 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 в строку, а не наоборот (вот о чем вопрос).
Если вы используете интерпретатор python, вы можете просто ввести 0x (ваше шестнадцатеричное значение), и интерпретатор автоматически преобразует его для вас.
>>> 0xffff
65535
Обрабатывает 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)
с префиксом «0x» вы также можете использовать функцию eval
Например
>>a='0xff'
>>eval(a)
255
ast.literal_eval
.