Как выполнить преобразование двоичной строки в соответствующее шестнадцатеричное значение в Python?
У меня есть 0000 0100 1000 1101
, и я хочу получить 048D
Я использую Python 2.6.
Как выполнить преобразование двоичной строки в соответствующее шестнадцатеричное значение в Python?
У меня есть 0000 0100 1000 1101
, и я хочу получить 048D
Я использую Python 2.6.
Добро пожаловать в StackOverflow!
int
с базой 2, а затем hex
:
>>> int('010110', 2)
22
>>> hex(int('010110', 2))
'0x16'
>>>
>>> hex(int('0000010010001101', 2))
'0x48d'
Документ int
:
int(x[, base]) -> integer Convert a string or number to an integer, if possible. A floating
точка аргумент будет усечен к нулю (это не включает строку представление числа с плавающей запятой!) При преобразовании строки, использование необязательная база. Ошибка при создании базы при преобразовании нестроковый. Если основание равно нулю, правильная база угадывается на основе Строковое содержимое. Если аргумент находится за пределами целочисленного диапазона a длинный объект будет возвращен.
Док hex
:
hex(number) -> string Return the hexadecimal representation of an integer or long
целое число.
bstr = '0000 0100 1000 1101'.replace(' ', '')
hstr = '%0*X' % ((len(bstr) + 3) // 4, int(bstr, 2))
Использовать модуль python binascii
import binascii
binFile = open('somebinaryfile.exe','rb')
binaryData = binFile.read(8)
print binascii.hexlify(binaryData)
Преобразование двоичного кода в шестнадцатеричное без игнорирования начальных нулей:
Вы можете использовать встроенную функцию format() следующим образом:
"{0:0>4X}".format(int("0000010010001101", 2))
Использование беспорядочных конкатенаций и отступов:
'{:0{width}x}'.format(int(temp,2)), width=4)
Дает шестнадцатеричное представление с сохранением отступов
Предполагая, что они сгруппированы на 4 и разделены пробелами. Это сохраняет ведущее 0.
b = '0000 0100 1000 1101'
h = ''.join(hex(int(a, 2))[2:] for a in b.split())
format(int(bits, 2), '0' + str(len(bits) / 4) + 'x')
По какой-то причине у меня были проблемы с некоторыми из этих ответов, я пошел и написал несколько вспомогательных функций для себя, поэтому, если у вас есть такие проблемы, как я, попробуйте.
def bin_string_to_bin_value(input):
highest_order = len(input) - 1
result = 0
for bit in input:
result = result + int(bit) * pow(2,highest_order)
highest_order = highest_order - 1
return bin(result)
def hex_string_to_bin_string(input):
lookup = {"0" : "0000", "1" : "0001", "2" : "0010", "3" : "0011", "4" : "0100", "5" : "0101", "6" : "0110", "7" : "0111", "8" : "1000", "9" : "1001", "A" : "1010", "B" : "1011", "C" : "1100", "D" : "1101", "E" : "1110", "F" : "1111"}
result = ""
for byte in input:
result = result + lookup[byte]
return result
def hex_string_to_hex_value(input):
bin_string = hex_string_to_bin_string(input)
bin_value = bin_string_to_bin_value(bin_string)
return hex(int(bin_value, 2))
Они, похоже, хорошо работают.
print hex_string_to_hex_value("FF")
print hex_string_to_hex_value("01234567")
print bin_string_to_bin_value("11010001101011")
приводит к:
0xff
0x1234567
0b11010001101011
>>> import string
>>> s="0000 0100 1000 1101"
>>> ''.join([ "%x"%string.atoi(bin,2) for bin in s.split() ] )
'048d'
>>>
или
>>> s="0000 0100 1000 1101"
>>> hex(string.atoi(s.replace(" ",""),2))
'0x48d'