Этот код возвращает двоичную строку в 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 ответ
Я не знаю, есть ли способ потребления памяти быстрее или меньше, но вы можете написать его более элегантно, используя список
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