Общий подход состоит в том, чтобы считывать исходный буфер настолько эффективно, насколько это возможно, и сдвигать его по мере необходимости на пути к записи в буфер назначения.
Вам не нужно выполнять байтовые операции, вы всегда можете выровнять исходные чтения long
, выровненные для основной массы операции, выполнив до трех байтов в начале, и аналогично обработав конец, так как вы не должны попытка чтения за указанную длину исходного буфера.
Из прочитанных значений вы сдвигаетесь по мере необходимости, чтобы получить желаемое выравнивание битов и собирать готовые байты для записи в место назначения. Вы также можете выполнить ту же оптимизацию записи для максимально широкого выровненного слова.
Если вы покопаетесь в исходном коде в инструменте сжатия или библиотеке, которая широко использует токены переменной ширины (zlib, MPEG, TIFF и JPEG - все на ум), вы, скорее всего, найдете пример кода, который обрабатывает ввод или выходной буфер как поток битов, о котором нужно будет подумать.