Алгоритм сжатия Хаффмана - 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 в файл }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д