Поясняю замысел. Я описал именно кодирование для выделение элементов протокола, т.е. канальный уровень. Как пример
https://ru.wikiped …0%B2%D0%B5%D0%BD%D1%8C
Описание кусков протокола я привел в качестве обоснования списка того, что надо кодировать. Получилось убого, согласен.
Замысел.
Пусть нам надо передать 56 бит. Ну стоим мы на асфальте и лыжи не едут :)
7 символов - выделили по 7 младших бит, старший 0, положили в 7 байт.
8й символ. Выделили 7 младших бит. Сдвинули, наложили маску, OR с байтом 0 из предыдущего пункта. Снова сдвинули наложили, OR с байтом 1 и т.д.
Получили 7 8битных байтов. Теперь мы хотим смазать лыжи.
Передаем два символа: 1 из 16 - младшие 4 бита, 1 из 16 - старшие. Сложили, положили в 8-й байт.
Ели 8-й байт конструировать из двух 7-битных, то будет не так красиво алоритмически, но да, биты похерятся.
С другой стороны - 6 бит будет свободным, можно CRC-5 как в USB применить
https://ru.wikiped …%B9_%D0%BA%D0%BE%D0%B4
Декодер основан на таблице 256 двухбайтных слов:
-- младший байт - битовое поле, закодированное символом
-- старший байт - битовый признак класса, что это за символ.
Для экономии можно 7 битные символы обрабатывать без таблицы: проверка старшего бита, маска - готовы информационные биты.
Такой способ кодирования эaффективен и для С, и для asm.