Сборка алгоритма Хаффмана - PullRequest
       14

Сборка алгоритма Хаффмана

0 голосов
/ 10 декабря 2011

Мне нужно написать программу для сжатия / распаковки текстовых файлов с использованием алгоритма Хаффмана

Я написал ее, и она хорошо работает для файлов, у которых меньше символов, чем размер буфера, но она не работает для файловс большим количеством символов.

Моя проблема состоит в том, чтобы связать буфер сжатия с буфером декомпрессии.

Так что, если число байтов, записанных сжатием (которое содержит 1 и 0, чтобы пройти черездерево), отличается от количества байтов, которые считывает декомпрессия, но не работает.Например, если буфер сжатия записывает 200, мне нужно, чтобы буфер распаковки считывал ровно 200 байтов.

Если я установил размер декомпрессии равным 200, то где-то сжатие будет записывать в 200, а в других случаях меньше.или больше 200.

Можете ли вы предложить что-нибудь, как отслеживать количество байтов, записываемых сжатием каждый раз, и передавать их в декомпрессионную часть?

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Обычный способ «отслеживать» конец потока - добавить N + 1 символ «EOF» специально для этого использования.Таким образом, вам не нужно поддерживать счетчик «size».

0 голосов
/ 11 декабря 2011

Я не использовал никаких буферов. В заголовке моего файла я записываю длину кода и сам код. Поэтому, когда я хочу распаковать свой файл, сначала я читаю длины и коды кода из моего заголовка (вы также можете поместить несколько байтов в заголовок, чтобы проверить правильность файла: например, XXY, поэтому, если файл не начинается с этих байтов, он поврежден ). После того, как я прочитал мои длины кода и мои коды, пришло время декодировать оставшиеся данные. Вы можете декодировать это так:

int data=0,dataLength=0;
while (input.read((char*)&sign, sizeof sign)) {     
    data = (data << 8) + sign;
    dataLength += 8;
    for (int i=0; i<256; i++) {
        if (dataLengthFromHeader[i]==0)
            continue;
        if (dataLength>=dataLengthFromHeader[i] && codesFromHeader[i] == data >> (dataLength-dataLengthFromHeader[i])) {
            unsigned char code = i;
            izlaz.write((char*)&code, sizeof code);
            dataLength -= dataLengthFromHeader[i];
            data = data - (codesFromHeader[i] << dataLength);
            if (dataLength==0) break;
                i=0;
        }
    }
}
...