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

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

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

Если вам просто нужно записать в коде целое число в шестнадцатеричном формате, просто напишите 0xffff без кавычек, это уже целочисленный литерал.

Boris 23.01.2021 12:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
837
1
1 030 048
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

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

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

где 16 для?

Max 27.10.2020 14:47

Для шестнадцатеричного основания. 8 - восьмеричный, например

Cherny 30.11.2020 11:10

@Max 16 предназначен для база 16. Обычно люди используют основание 10 (а в Python есть неявный 10, когда вы не передаете второй аргумент int()), где вы начинаете с 0, затем подсчитываете 0123456789 (всего 10 цифр), прежде чем вернуться к 0 и добавить 1 к место следующих единиц. В базе 16 (также называемой «шестнадцатеричной» или для краткости «шестнадцатеричной») вы начинаете с 0, затем подсчитываете 0123456789ABCDEF (всего 16 цифр). Функция int принимает любое число от 2 до 36 в качестве основы, она просто расширяет алфавит: база 36 - это 0123456789ABCEDFGHIJKLMNOPQRSTUVWXYZ.

Boris 23.01.2021 12:16

Для любой данной строки 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 13.01.2018 19:36

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

Dan Lenski 13.01.2018 22:47

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

Bachsau 13.01.2018 22:51

@DanLenski, он всегда преобразует шестнадцатеричные строки в положительные числа. Я хочу, чтобы int("FFFF",16) был преобразован в -1.

Nazar 16.03.2020 01:38

@Nazar, это было давно, так что это, вероятно, бесполезно для вас в данный момент, но для всех, кто случайно здесь наткнется, если требуется применение двух правил дополнения. Этот ответ может помочь stackoverflow.com/questions/1604464/twos-complement-in-pytho‌ н

Jeremy 03.04.2020 17:08

@Nazar, вам следует остановиться и подумать на мгновение о том, почему это полностью и совершенно неоднозначный запрос, а затем написать свою собственную простую функцию-оболочку, которая принимает заданную ширину в битах в качестве дополнительного аргумента.

Dan Lenski 17.08.2020 12:27

Добавление к ответу Дэна выше: если вы предоставите функцию 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.

ALOToverflow 18.04.2013 19:06

На самом наименее вы должны использовать ast.literal_eval.

Andy Hayden 11.06.2013 04:46

Тоже очень медленно. Худший способ когда-либо.

Tõnu Samuel 03.04.2016 10:44

Параметр форматирования "% 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 в строку, а не наоборот (вот в чем вопрос).

André Laszlo 07.08.2015 19:04

Спасибо за ваш вклад, я согласен, что мой ответ неправильный, и теперь я исправил его. Однако я понимаю, что часть ответа является избыточной, как указано выше, то есть с использованием int (string, base), но все же остальная часть ответа добавляет больше параметров к сообщению, я считаю. Соглашаться ?

Soundararajan 10.08.2015 12:44

Не имеет значения; речь идет о преобразовании из базы 16 в базу 10, а не наоборот

pppery 01.08.2017 23:46

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

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

>>> hex_to_int("c0ffee")
12648430

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

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

Стоит отметить, что eval также абсурдно медленный, помимо всех других проблем с ним.

j6m8 01.11.2015 23:22

Если это плохая идея, то какой смысл ее поднимать?

pppery 31.07.2017 22:29

Хорошая точка зрения. Отчасти потому, что мне это кажется забавным, а отчасти потому, что я видел это в производственном коде.

André Laszlo 31.07.2017 22:57

Я, вероятно, должен отметить, что раньше делал это после того, как у меня возникли проблемы с возвращением неверных значений int(s,16), что вызывало некоторые серьезные проблемы с моей средой выполнения (int(hex(value),16) == int(value) >>> False). строка, переданная в eval(), была безопасной, а возвращенное значение - правильным.

Tcll 14.06.2019 21:51

@Tcll Вау, странно, какую версию Python вы использовали? Вы записали значения, из-за которых возникла проблема?

André Laszlo 14.06.2019 22:23

@ AndréLaszlo Я не совсем уверен, но если бы это было так давно, я бы, наверное, догадался, что это портативный питон 2.7.5, и нет, я не помню значений, которых боюсь ... Я был новичком в время, поэтому я не отслеживал так много, как сейчас, но сейчас я использую Anaconda 2.3.0 в качестве портативного интерпретатора, и я просто попробовал несколько очень больших наборов данных, где все соответствовало должным образом ... не конечно, насколько хорошо я ему в целом доверяю.

Tcll 15.06.2019 02:25

я нашел это забавным и поучительным, я рад, что это было опубликовано

frogeyedpeas 06.05.2020 04:19

Это не отвечает на вопрос, потому что это не работает на "0xffff".

marcelm 14.10.2020 18:47

Только что получил отрицательный голос, но я оставлю этот ответ, так как он все еще ... очень распространен: github.com/…

André Laszlo 16.03.2021 21:26

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

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

>>a = int('deadbeef',16)
>>float(a)
3735928559.0

Как это отвечает на вопрос?

pppery 01.08.2017 23:45

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.

gaoithe 10.10.2019 14:20

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

ast.literal_eval("0xffff")

Демо:

>>> import ast
>>> ast.literal_eval("0xffff")
65535
>>> 

Это работает, но намного медленнее, чем int(..., base=16).

Niklas Mertsch 28.02.2021 20:58

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

shrewmouse 12.11.2020 21:52

Другие вопросы по теме