Алгоритм сжатия Хаффмана - 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 в файл
}