Девять - трудный счет для работы. Первый вопрос: можно ли работать в 8 битах?
Если бы не было, я бы посмотрел на распределение на уровне словаря и упаковку ваших 9-битных слов, не обращая внимания на границы байтов. 512-байтовый словарь = 4096 бит = 455 9-битных символов. Вам просто нужна математика для доступа к этим символам из вашего битового потока:
byte[] buffer = new byte[512];
function getWord(int wordOfs) {
// Gets wordOfs'th 9-bit symbol from buffer, For buffer of 512 bytes, wordOfs = 0 -> 454
if (wordOfs<0 || wordOfs>454) throw InvalidArgumentException;
int bitsOfs = wordOfs * 9; // Offset (in bits) of the desired 9 bit word
int idx = bitsOfs / 8; // buffer[idx] contains bit 0 of the desired word
int ofs = bitsOfs % 8; // ... shifted this many places to the right
// Grab at least 8 bits beyond the calculated starting point
unsigned word val = buffer[idx] | (buffer[idx+1]>>8);
// Shift and mask it down to the desired 9 bits for return
return (val << ofs) & 0x01FF;
}
Предостережение: у меня сейчас нет доступа к компилятору Java, возможно, синтаксис должен работать.