





int(hexstring, 16) делает свое дело и работает с префиксом 0x и без него:
>>> int("a", 16)
10
>>> int("0xa", 16)
10
где 16 для?
Для шестнадцатеричного основания. 8 - восьмеричный, например
@Max 16 предназначен для база 16. Обычно люди используют основание 10 (а в Python есть неявный 10, когда вы не передаете второй аргумент int()), где вы начинаете с 0, затем подсчитываете 0123456789 (всего 10 цифр), прежде чем вернуться к 0 и добавить 1 к место следующих единиц. В базе 16 (также называемой «шестнадцатеричной» или для краткости «шестнадцатеричной») вы начинаете с 0, затем подсчитываете 0123456789ABCDEF (всего 16 цифр). Функция int принимает любое число от 2 до 36 в качестве основы, она просто расширяет алфавит: база 36 - это 0123456789ABCEDFGHIJKLMNOPQRSTUVWXYZ.
Для любой данной строки s:
int(s, 16)
Без префикс 0x, вам нужно указать базу явно, иначе нет способа сказать:
x = int("deadbeef", 16)
С префикс 0x, Python может автоматически различать шестнадцатеричные и десятичные числа.
>>> print(int("0xdeadbeef", 0))
3735928559
>>> print(int("10", 0))
10
(Вы должен указываете 0 в качестве базы, чтобы вызвать это поведение угадывания префикса; если вы опустите второй параметр, int() будет принимать base-10.)
Это означает, что вы всегда должны использовать 16 в качестве второго аргумента. Явное лучше, чем неявное.
@bachsau, явно неправда. Что, если вы хотите читать вводимые пользователем данные, разрешая ввод в шестнадцатеричном или десятичном формате, в зависимости от того, что удобно для пользователя?
Хорошо, я должен был сказать: в этом конкретном случае! Первоначальный вопрос был «Как преобразовать шестнадцатеричную строку…». Если вы хотите оставить это пользователю, то это полезная функция, в этом вы правы.
@DanLenski, он всегда преобразует шестнадцатеричные строки в положительные числа. Я хочу, чтобы int("FFFF",16) был преобразован в -1.
@Nazar, это было давно, так что это, вероятно, бесполезно для вас в данный момент, но для всех, кто случайно здесь наткнется, если требуется применение двух правил дополнения. Этот ответ может помочь stackoverflow.com/questions/1604464/twos-complement-in-pytho н
@Nazar, вам следует остановиться и подумать на мгновение о том, почему это полностью и совершенно неоднозначный запрос, а затем написать свою собственную простую функцию-оболочку, которая принимает заданную ширину в битах в качестве дополнительного аргумента.
Добавление к ответу Дэна выше: если вы предоставите функцию int () шестнадцатеричной строкой, вам нужно будет указать базу как 16, иначе она не подумает, что вы дали ей допустимое значение. Для шестнадцатеричных чисел, не содержащихся в строках, указывать основание 16 не нужно.
print int(0xdeadbeef) # valid
myHex = "0xdeadbeef"
print int(myHex) # invalid, raises ValueError
print int(myHex , 16) # valid
с префиксом '0x' вы также можете использовать функцию eval
Например
>>a='0xff'
>>eval(a)
255
При использовании eval убедитесь, что проверка ввода выполнена правильно. На самом деле, вероятно, есть способ получше. Не используйте eval.
На самом наименее вы должны использовать ast.literal_eval.
Тоже очень медленно. Худший способ когда-либо.
Параметр форматирования "% 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), но все же остальная часть ответа добавляет больше параметров к сообщению, я считаю. Соглашаться ?
Не имеет значения; речь идет о преобразовании из базы 16 в базу 10, а не наоборот
Худший способ:
>>> def hex_to_int(x):
return eval("0x" + x)
>>> hex_to_int("c0ffee")
12648430
Использование eval в Python - плохая практика?
Стоит отметить, что eval также абсурдно медленный, помимо всех других проблем с ним.
Если это плохая идея, то какой смысл ее поднимать?
Хорошая точка зрения. Отчасти потому, что мне это кажется забавным, а отчасти потому, что я видел это в производственном коде.
Я, вероятно, должен отметить, что раньше делал это после того, как у меня возникли проблемы с возвращением неверных значений int(s,16), что вызывало некоторые серьезные проблемы с моей средой выполнения (int(hex(value),16) == int(value) >>> False). строка, переданная в eval(), была безопасной, а возвращенное значение - правильным.
@Tcll Вау, странно, какую версию Python вы использовали? Вы записали значения, из-за которых возникла проблема?
@ AndréLaszlo Я не совсем уверен, но если бы это было так давно, я бы, наверное, догадался, что это портативный питон 2.7.5, и нет, я не помню значений, которых боюсь ... Я был новичком в время, поэтому я не отслеживал так много, как сейчас, но сейчас я использую Anaconda 2.3.0 в качестве портативного интерпретатора, и я просто попробовал несколько очень больших наборов данных, где все соответствовало должным образом ... не конечно, насколько хорошо я ему в целом доверяю.
я нашел это забавным и поучительным, я рад, что это было опубликовано
Это не отвечает на вопрос, потому что это не работает на "0xffff".
Только что получил отрицательный голос, но я оставлю этот ответ, так как он все еще ... очень распространен: github.com/…
В Python 2.7 int('deadbeef',10), похоже, не работает.
Для меня работает следующее:
>>a = int('deadbeef',16)
>>float(a)
3735928559.0
Как это отвечает на вопрос?
Convert hex string to int in Python
I may have it as
"0xffff"or just"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 выводить. Если вы передадите 0 как основание, int будет выводить основание из префикса в строке». Как преобразовать из шестнадцатеричного или десятичного (или двоичного) в целое число, как это делает интерпретатор Python.
Или ast.literal_eval (это безопасно, в отличие от eval):
ast.literal_eval("0xffff")
Демо:
>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>>
Это работает, но намного медленнее, чем int(..., base=16).
Если вы используете интерпретатор Python, вы можете просто ввести 0x (ваше шестнадцатеричное значение), и интерпретатор автоматически преобразует его для вас.
>>> 0xffff
65535
Обрабатывает шестнадцатеричный, восьмеричный, двоичный, 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)
@SergeyVoronezhskiy, 3.8.2 и 3.9 все еще не распознают '010' как восьмеричное (десятичное 8). Похоже, им еще нужна приставка 0o. Я уверен, что это сделано для того, чтобы не интерпретировать числа с дополнением 0 как очень необычное восьмеричное. Итак, на самом деле ничего не изменилось с тех пор, как я опубликовал этот ответ в 2019 году.
Если вам просто нужно записать в коде целое число в шестнадцатеричном формате, просто напишите
0xffffбез кавычек, это уже целочисленный литерал.