Как преобразовать шестнадцатеричную строку в int в Python?
Я могу использовать его как "0xffff
" или просто "ffff
".
Как преобразовать шестнадцатеричную строку в int в Python?
Я могу использовать его как "0xffff
" или просто "ffff
".
Без префикса 0x вам нужно явно указать базу, иначе нет способа сказать:
x = int("deadbeef", 16)
С префикс 0x, Python может отличать hex и decimal автоматически.
>>> print int("0xdeadbeef", 0)
3735928559
>>> print int("10", 0)
10
(Вы должны указать 0
в качестве базы, чтобы вызвать это поведение при префикс-угадывании; опускание второго параметра означает, что предполагается base-10.)
int(hexString, 16)
выполняет трюк и работает с префиксом 0x и без него:
>>> int("a", 16)
10
>>> int("0xa",16)
10
Для любой заданной строки 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
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 не могут начинаться с числового символа.
Добавляя к Дану ответ выше: если вы предоставите функцию 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
Или 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
В Python 2.7, int('deadbeef',10)
, похоже, не работает.
Для меня работает следующее:
>>a = int('deadbeef',16)
>>float(a)
3735928559.0
Если вы используете интерпретатор python, вы можете просто ввести 0x (ваше шестнадцатеричное значение), и интерпретатор автоматически преобразует его для вас.
>>> 0xffff
65535
с префиксом '0x', вы также можете использовать функцию eval
Например
>>a='0xff'
>>eval(a)
255
Чтобы преобразовать DWORD из шестнадцатеричного числа в целое число со знаком, выполните два дополнения следующим образом:
~ (0xffffffff - int('0xdeadbeef', 16)) + 1