Это хорошая удобная утилита для преобразования шестнадцатеричного кода в двоичный в виде строки?

Этот код возвращает двоичную строку в 4-значной форме для данного шестнадцатеричного кода в виде строки.

def str_bin_in_4digits(aString):
    retStr=""
    for i in aString:
        retStr = retStr+"{0:04b}".format(int(i, 16))+" "
    return retStr.strip()

Например,

>>> str_bin_in_4digits("20AC")
0010 0000 1010 1100

Код работает, как ожидалось, и меня беспокоит, может ли он быть более элегантным, например, быстрее или с меньшим потреблением памяти?

1 ответ
1

Я не знаю, есть ли способ потребления памяти быстрее или меньше, но вы можете написать его более элегантно, используя список

def str_bin_in_4digits(aString):

    data = []

    for i in aString:
        data.append( "{0:04b}".format(int(i, 16)) )

    retStr = " ".join(data)

    return retStr  # doesn't need strip()

а затем вы можете написать это также как понимание списка

def str_bin_in_4digits(aString):

    data = ["{0:04b}".format(int(i, 16)) for i in aString]
    retStr = " ".join(data)

    return retStr  # doesn't need strip()

а затем вы можете даже сократить до одной строки

def str_bin_in_4digits(aString):

    return " ".join(["{0:04b}".format(int(i, 16)) for i in aString])

Возможно, даже при использовании понимания списка это может быть немного быстрее, но для небольшой строки вы можете этого не увидеть.

Теперь вам нужно выбрать только наиболее читаемую версию.


Проблема в том, что у вас есть 4-bits values (одинарный шестнадцатеричный символ).

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

 bytes_data = bytes.fromhex('0A 0B 0C')

 bytes_data = bytes.fromhex('0A0B0C')

а позже вы снова можете использовать понимание списка — используя f-string это могло быть даже короче

 data = [f'{x:04b}' for x in bytes_data]

Но с 8-bits вам придется разделить его на 4-bits используя что-то вроде этого

bytes_data[0] >> 4,  bytes_data[0] & 0x0f

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *