Python, как декодировать двоичный десятичный код (BCD)
описание двоичного поля:
номер вызывающего абонента, выраженный сжатым кодом BCD, а избыточные биты заполняются "0xF"
Я попытался распечатать с помощью формата struct '16c'
а я: ('3', 'x00', 'x02', 'x05', 'x15', 'x13', 'G', 'O', 'xff', 'xff', 'xff', 'xff', 'xff', 'xff', 'xff', 'xff')
и если я использую '16b'
Я (51, 0, 2, 5, 21, 19, 71, 79, -1, -1, -1, -1, -1, -1, -1, -1)
. И это неправильно, я должен получить номер телефона, а номера выше недействительны.
print struct.unpack_from('>16b', str(data.read()),offset=46)
выше код, который не работал, и я получаю недопустимые номера. С какой формат распакуйте это 16-байтовое поле и как преобразовать код BCD ?
1 ответов
коды BCD работают с 4 битами на номер и обычно кодируют только цифры 0-9. Таким образом, каждый байт в вашей последовательности содержит 2 числа, 1 на 4 бита информации.
следующий метод использует генератор для получения этих цифр; я предполагаю, что значение 0xF означает, что больше нет цифр, чтобы следовать:
def bcdDigits(chars):
for char in chars:
char = ord(char)
for val in (char >> 4, char & 0xF):
if val == 0xF:
return
yield val
здесь я использую оператор сдвига вправо переместить левые 4 бита вправо, и побитовое и выбрать просто самые правые 4 бита.
демонстрация:
>>> characters = ('3', '\x00', '\x02', '\x05', '\x15', '\x13', 'G', 'O', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff', '\xff')
>>> list(bcdDigits(characters))
[3, 3, 0, 0, 0, 2, 0, 5, 1, 5, 1, 3, 4, 7, 4]
метод работает с c
вывод; вы можете пропустить ord
вызовите метод, если вы передаете целые числа напрямую (но используйте B
вместо этого вариант без знака). Кроме того, вы можете просто прочитать эти 16 байтов прямо из своего файла и применить эту функцию к этим байтам напрямую без использования struct.