Алгоритм сжатия Хаффмана - C# (194728)

Узнай цену своей работы

Формулировка задачи:

Может кто сталкивался с таким алгоритмом? Может у кого нибудь есть исходник, или подробный алгоритм? На разных сайтах смотрел, не понято как реализовать данный алгоритм.

Решение задачи: «Алгоритм сжатия Хаффмана»

textual
Листинг программы
char *str="HEFB";
 
#define CODETYPE char
struct hash{
  char symb;
  CODETYPE code; // Код. Пусть будет char - общности не нарушит.
  char codelen;  // Длина в битах
};
 
#define TABLEN 4
struct hash table[]={
  {'H',0x00,1}, // 0
  {'E',0x07,3}, // 111
  {'F',0x18,5}, // 11000
  {'B',0x19,5}};// 11001
// итого, от строки HEBF должно получиться:
//Первый байт '1000][111][0]' Второй байт: '00[11001][1'.
 
#define BUFLEN 255
char buf[BUFLEN];     // буфер, накапливает коды
 
unsigned int i,j,k=0; // i - индекс символа в строке str
                      // j - индекс элемента массива table
                      // k - индекс текущего байта в буфере buf
char cb1,cb2, cbc=0;  // cb2 и cb1 - буферные байты
                      // cbc - число зполненных бит в cb2
                      // cb2 - скидывается в buf по заполнению всех 8 битов
CODETYPE cod;         // буфер для кода
char len;             // кода в буфере cod
 
int main(){
for (i=0;i<strlen(str);i++){                          //проходим строку посимвольно
  for (j=0; (j<TABLEN)&&(table[j].symb!=str[i]); j++); //определяем элемент table, соответствующей текущему символу
  len=table[j].codelen;   // сохраняем длину кода
  cod=table[j].code;      // и сам код в буферах
  do{ 
    if (cbc+len>8){           // Если у нас остатки кода не влезают cb2
      cb1=(char)cod<<cbc;     // Производим  
      cod>>=cbc;              // слабообъяснимые
      len-=8-cbc;             // манипуляции
      cbc=8;                  // Которые заполняют буфер cb2 до конца
    }
    else{                     // Если код вмещается в буфер целиком
      cb1=(char)cod<<cbc;     // Сдвигаем его на число заполенных бит
      cbc+=len;               // Засчитываем увеличение числа запоненных бит в cb2
      len=0;                  // А буфер кода - пуст.
    }
    cb2|=cb1;                 // Заполняем пустые биты куском кода
    if (cbc==8){              // Если буфер cb2 полностью заполнен
      buf[k]=cb2;             // Скидываем его в buf
      cb2=0;                  // обнуляем
      k++;                    // Переходим к следующему байту в buf
      cbc=0;                  // Отмечаем обнуление cb2
      if (k==BUFLEN){         // Если buf заполнен
        k=0;                  // J,yekztv cx`nxbr
        //скидываем буфер buf в файл
        strnset(buf,0,BUFLEN); // очищаем buf
      }
    }
  }while(len!=0);
}
buf[k]=cb2;                   // заключительный аккорд
//скидываем буфер buf в файл
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.8 из 5