Проблема с сохранением 9-битных кодов в буфере для сжатия lzw - PullRequest
0 голосов
/ 16 октября 2019

Для моего кода сжатия LZW. Я решил хранить коды в 9-битных кодах, размер словаря будет 512, поэтому в нем будет только 256 новых символов. Теперь я чувствую, что не выбрал правильный буфер для работы:

byte[] buffer = new byte[3];

Этот буфер больше подходит для хранения 12 бит, что эквивалентно 9 битам и как я могу сохранить 9биты в буфере правильно?

Я использовал это для хранения 8 битов в буфере [0] и 4 битов в буфере [1]. Что эквивалентно для 9 бит?

buffer[0] = (byte) (code & 255);
buffer[1] = (byte) ((code >> 8) << 4);

1 Ответ

0 голосов
/ 16 октября 2019

Девять - трудный счет для работы. Первый вопрос: можно ли работать в 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, возможно, синтаксис должен работать.

...