Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Компрессия/декомпрессия RLE

Поиск:

Код

//////////////////////////////////////////////////////////////////////////////
//
//  Compressing/decompressing file (RLE technology)
//  (c) Johna Smith, 1996
//
//  Method description:
//  This compression method is based on coding sequences like AAA..A
//  We can write this sequence as two bytes N A, where A is
//  character and N is amount of its repetitions. So this method is
//  very useful for *.bmp files. But if there aren't such sequences
//  then each separate character will turn into two - 1 A 1 B ...
//
//////////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <string.h>
#include <errno.h>

void usage(void)
{
  // show how to use this program if there isn't enough parameters
  printf("Usage: compress.exe filename1 COMPRESS|DECOMPRESS filename2n");
  printf("filename1 - name of source filen");
  printf("filename2 - name of destination filen");
  printf("nExample: compress.exe compress.bmp COMPRESS compress.rlen");
}

FILE *input, *output;

void compress(void)
{
  unsigned char c1,c,length;
  unsigned long int rcounter=0,wcounter=0;

  fread(&c1,sizeof(char),1,input);
  do
  {
    c=c1;
    length=0;
    do
    {
      fread(&c1,sizeof(char),1,input);
      length++;
      rcounter++;
    } while (!feof(input) && c1==c && length!=255);
    // putting char and number of its repetitions to output
    fwrite(&c,sizeof(char),1,output);
    fwrite(&length,sizeof(char),1,output);
    wcounter++;
  } while (!feof(input));
  printf("%ld byte(s) compressedn",rcounter);
  printf("ratio: %dn",wcounter/rcounter);
}

void decompress(void)
{
  unsigned char c,length;
  unsigned long int rcounter=0,wcounter=0;

  fread(&c,sizeof(char),1,input);
  do
  {
    fread(&length,sizeof(char),1,input);
    for(int i=0;i<length;i++)
    {
      fwrite(&c,sizeof(char),1,output);
      wcounter++;
    }
    fread(&c,sizeof(char),1,input);
    rcounter+=2;
  } while (!feof(input));
  printf("%ld byte(s) decompressedn",wcounter);
  printf("ratio: %dn",wcounter/rcounter);
}

void main(int argc, char **argv)
{
  // copyleft;)_
  printf("Compress. copyleft {c} 1996 Johna Smith. freewarenn");
  // analysing parameters
  if (argc!=4)
  {
    usage();
    return;
  }
  if ((input=fopen(argv[1],"rb"))==NULL)
  {
    // error opening file
    printf("! ERR03: can't open source file :(n");
    return;
  };
  if ((output=fopen(argv[3],"wb"))==NULL)
  {
    // error opening file
    fclose(input);
    printf("! ERR04: can't open destination file :(n");
    return;
  };
  if (stricmp(argv[2],"COMPRESS")==0) compress();else
  if (stricmp(argv[2],"DECOMPRESS")==0) decompress();else
  {
    // must be COMPRESS or DECOMPRESS magic word there to know what to do
    printf("! ERR02: serious bug was found in second parameter :)n");
    fclose(input);
    fclose(output);
    return;
  }
  fclose(input);
  fclose(output);
}
Сайт: forum.vingrad.ru






Просмотров: 3067

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную