Подтвердить что ты не робот

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

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

У меня есть 0000 0100 1000 1101, и я хочу получить 048D Я использую Python 2.6.

4b9b3361

Ответ 1

Добро пожаловать в 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

целое число.

Ответ 2

bstr = '0000 0100 1000 1101'.replace(' ', '')
hstr = '%0*X' % ((len(bstr) + 3) // 4, int(bstr, 2))

Ответ 3

Использовать модуль python binascii

import binascii

binFile = open('somebinaryfile.exe','rb')
binaryData = binFile.read(8)

print binascii.hexlify(binaryData)

Ответ 4

Преобразование двоичного кода в шестнадцатеричное без игнорирования начальных нулей:

Вы можете использовать встроенную функцию format() следующим образом:

"{0:0>4X}".format(int("0000010010001101", 2))

Ответ 5

Использование беспорядочных конкатенаций и отступов:

'{:0{width}x}'.format(int(temp,2)), width=4)

Дает шестнадцатеричное представление с сохранением отступов

Ответ 6

Предполагая, что они сгруппированы на 4 и разделены пробелами. Это сохраняет ведущее 0.

b = '0000 0100 1000 1101'
h = ''.join(hex(int(a, 2))[2:] for a in b.split())

Ответ 7

format(int(bits, 2), '0' + str(len(bits) / 4) + 'x')

Ответ 8

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

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

Ответ 9

>>> 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'