20949

Стиснення даних

Лабораторная работа

Информатика, кибернетика и программирование

define MAX_VALUE 1 BITS 1 Отметим что на MSDOSмашине при define MAX_CODE MAX_VALUE 1 длине кода 14 бит необходимо компи лировать используя largeмодель. define TABLE_SIZE 9029 endif if BITS = 12 define TABLE_SIZE 5021 endif void malloc; Это массив для значений кодов int code_value; Этот массив содержит префиксы кодов unsigned int prefix_code; Этот массив содержит...

Украинкский

2013-08-01

55.23 KB

3 чел.

Міністерство освіти, науки, молоді та спорту України

Національний технічний Університет “ХПІ”

“ХАРКІВСКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ”

Кафедра “ Обчислювальна техніка та програмування ”

Лабораторна робота №4

по курсу “Захист інформації у комп’ютерних системах та мережах”

 

                                                                                                Виконав:

                                                                                                      ст. гр КІТ 39

 Родін С.І

                                                                                                 Перевірив:

Межерицький С.Г

Харків 2012

“Стиснення даних”

Ціль роботи: розробка програми стиснення інформації та повернення до початкового стану без втрат.

Постановка задачі: необхідно розробити і налагодити комплекс програм:

програма стиснення інформації (архівування). У якості інформації використовувати копію файлу з розробленою програмою. Розрахунок ступеню стиснення;програма повернення архівного файлу до початкового вигляду (розархівування).

Індивідуальні завданя:

Алгоритм arithm

#include <stdio.h>

#define BITS 12                  /* Установка длины кода равной 12, 13   */

#define HASHING_SHIFT BITS-8     /* или 14 битам.                        */

#define MAX_VALUE (1 << BITS) - 1/* Отметим, что на MS-DOS-машине при    */

#define MAX_CODE MAX_VALUE - 1   /* длине кода 14 бит необходимо компи-  */

                                /* лировать, используя large-модель.    */

#if BITS == 14

 #define TABLE_SIZE 18041       /* Размер таблицы строк должен быть     */

#endif                           /* простым числом, несколько большим,   */

#if BITS == 13                   /* чем 2**BITS.                         */

 #define TABLE_SIZE 9029

#endif

#if BITS <= 12

 #define TABLE_SIZE 5021

#endif

void *malloc();

/* Это массив для значений кодов            */

int *code_value;                 

/* Этот массив содержит префиксы кодов      */

unsigned int *prefix_code;       

/* Этот массив содержит добавочные символы  */

unsigned char *append_character;

/* Этот массив содержит декодируемые строки */

unsigned char decode_stack[4000];

main(int argc, char *argv[])

{

FILE *input_file;

FILE *output_file;

FILE *lzw_file;

char input_file_name[81];

/*

**  Эти три буфера необходимы на стадии упаковки.

*/

code_value=malloc(TABLE_SIZE*sizeof(unsigned int));

prefix_code=malloc(TABLE_SIZE*sizeof(unsigned int));

append_character=malloc(TABLE_SIZE*sizeof(unsigned char));

if (code_value==NULL || prefix_code==NULL || append_character==NULL)

{

    printf("Fatal error allocating table space!\n");

    exit();

}

/*

** Получить имя файла, открыть его и открыть выходной lzw-файл.

*/

   if (argc>1)

       strcpy(input_file_name,argv[1]);

   else

   {

       printf("Input file name? ");

       scanf("%s",input_file_name);

   }

   input_file=fopen(input_file_name,"rb");

   lzw_file=fopen("test.lzw","wb");

   if (input_file==NULL || lzw_file==NULL)

   {

       printf("Fatal error opening files.\n");

       exit();

   };

/*

** Сжатие файла.

*/

   compress(input_file,lzw_file);

   fclose(input_file);

   fclose(lzw_file);

   free(code_value);

/*

** Сейчас открыть файлы для распаковки.

*/

   lzw_file=fopen("test.lzw","rb");

   output_file=fopen("test.out","wb");

   if (lzw_file==NULL || output_file==NULL)

   {

       printf("Fatal error opening files.\n");

       exit();

   };

/*

** Распаковка файла.

*/

   expand(lzw_file,output_file);

   fclose(lzw_file);

   fclose(output_file);

   free(prefix_code);

   free(append_character);

}

/*

** Процедура сжатия.

*/

compress(FILE *input,FILE *output)

{

unsigned int next_code;

unsigned int character;

unsigned int string_code;

unsigned int index;

int i;

   next_code=256;    /* Next_code - следующий доступный код строки */

   for (i=0;i<TABLE_SIZE;i++)/*Очистка таблицы строк перед стартом */

       code_value[i]=-1;

   i=0;

   printf("Compressing...\n");

   string_code=getc(input);   /* Get the first code*/

/*

** Основной цикл. Он выполняется до тех пор, пока возможно чтение

** входного потока.  Отметим, что он прекращает заполнение таблицы

** строк после того, как все возможные коды были использованы.

*/

   while ((character=getc(input)) != (unsigned)EOF)

   {

       if (++i==1000)            /* Печатает * через каждые 1000  */

       {                         /* чтений  входных символов (для */

           i=0;                  /* умиротворения зрителя).       */

           printf("*");

       }

 /* Смотрит, есть ли строка */

       index=find_match(string_code,character);

       if (code_value[index] != -1)      /* в таблице.  Если есть,*/

   printf("Expanding...\n");

 old_code=input_code(input);/*Читается первый код, инициализируется*/

 character=old_code;   /* переменная character и посылается первый */

 putc(old_code,output);      /* код в выходной файл.      */

/*

**  Основной цикл распаковки.  Читаются коды из LZW-файла до тех пор,

**  пока не встретится специальный код, указывающий на конец данных.

*/

   while ((new_code=input_code(input)) != (MAX_VALUE))

   {

       if (++counter==1000) { counter=0; printf("*"); }

/*

** Проверка кода для специального случая

** STRING+CHARACTER+STRING+CHARACTER+

** STRING, когда генерируется неопределенный код.

** Это заставляет его декодировать последний код,

** добавив CHARACTER в конец декод. строки.

*/

       if (new_code>=next_code)

       {

           *decode_stack=character;

           string=decode_string(decode_stack+1,old_code);

       }

/*

** Иначе декодируется новый код.

*/

       else

           string=decode_string(decode_stack,new_code);

/*

** Выводится декодируемая строка в обратном порядке.

*/

       character=*string;

       while (string >= decode_stack)

           putc(*string--,output);

/*

** Наконец, если возможно, добавляется новый код в таблицу строк.

*/

       if (next_code <= MAX_CODE)

       {

           prefix_code[next_code]=old_code;

           append_character[next_code]=character;

           next_code++;

       }

       old_code=new_code;

   }

   printf("\n");

}

/*

** Процедура простого декодирования строки из таблицы строк,

* сохраняющая

** результат в буфер.  Этот буфер потом может быть выведен

** в обратном порядке программой распаковки.

*/

char *decode_string(unsigned char *buffer,unsigned int code)

{

int i;

   i=0;

   while (code > 255)

   {

       *buffer++ = append_character[code];

       code=prefix_code[code];

       if (i++>=4094)

       {

           printf("Fatal error during code expansion.\n");

           exit();

       }

   }

   *buffer=code;

   return(buffer);

}

/*

** Следующие две процедуры управляют вводом/выводом кодов

** переменной длины.  Они для ясности написаны чрезвычайно

** простыми и не очень эффективны.

*/

input_code(FILE *input)

{

unsigned int return_value;

static int input_bit_count=0;

static unsigned long input_bit_buffer=0L;

   while (input_bit_count <= 24)

   {

input_bit_buffer|=(unsigned long)getc(input)<<(24-input_bit_count);

input_bit_count += 8;

   }

   return_value=input_bit_buffer >> (32-BITS);

   input_bit_buffer <<= BITS;

   input_bit_count -= BITS;

   return(return_value);

}

output_code(FILE *output,unsigned int code)

{

static int output_bit_count=0;

static unsigned long output_bit_buffer=0L;

output_bit_buffer|=(unsigned long)code<<(32-BITS-output_bit_count);

   output_bit_count += BITS;

   while (output_bit_count >= 8)

   {

       putc(output_bit_buffer >> 24,output);

       output_bit_buffer <<= 8;

       output_bit_count -= 8;

   }

Висновок: розробив програму стиснення інформації та повернення до початкового стану без втрат.


 

А также другие работы, которые могут Вас заинтересовать

81748. Автор и главный герой поэмы А. Т. Твардовского «Василий Теркин». Роль фольклорных мотивов в поэме 41.54 KB
  Твардовского Василий Теркин. Вместе с тем Твардовский следовал своему намерению побольше самого себя в поэме: лирическое начало в Теркине расширилось по сравнению со Страной Муравией стало многогранным обогатило эпические традиции которые попрежнему сильно ощутимы в поэме но проявляются иначе чем прежде. Достоверность картин жизни поэт подчеркнул и тем что назвал Василия Теркина не поэмой или эпопеей а книгой про бойца. Кроме массы бойцов плотно населяющих поэму обрисованных лаконично но остро выразительно в Василии...
81749. Нравственная эволюция героя в рассказе А. П. Чехова «Ионыч». Анализ эпизода из рассказа 33.83 KB
  Чехов рассказывает печальную историю образованного дельного врача Дмитрия Ионыча Старцева превращающегося в провинциальной глуши в угрюмого нелюдима и черствого эгоиста. Старцев пытается войти в жизнь горожан найти отклик на те мысли и чувства которыми он живет но скоро опыт научил его малопомалу что пока с обывателем играешь в карты или закусываешь с ним то это мирный благодушны и даже неглупый человек но стоит только заговорить с ним о чемнибудь несъедобном например о политике или науке как он становится в тупик или заводит...
81750. Сны героев. Их художественная функция в произведениях отечественной литературы 32.96 KB
  С одной стороны жизнь в этой деревне поражает своей сонливостью безмолвием бездеятельностью. Закономерности существования определяют приметы: брови чешутся слёзы; лоб кланяться с правой стороны чешется мужчине с левой женщине; уши зачешутся значит к дождю. С другой стороны в описании Обломовки заметен акцент на великолепии окружающей природы на хлебосольстве господ поэзии быта усадьбы красоте народных праздников ласке матери. Подчеркнуты нравственные стороны рисуемой жизни: искренность доброта и незлобие: В глазах...
81751. Тема прошлого, настоящего и будущего России в пьесе А.Чехова «Вишневый сад». Роль символики и подтекста в чеховской драматургии 36.04 KB
  Ситуация из жизни отдельных людей внутренне соотнесена в пьесе с ситуацией в жизни страны так уже было у Ч. На первый взгляд это опятьтаки обычная чеховская пьеса дающая картину нелепой нескладной жизни. В отличие от всех предшествующих пьес Чехова в Вишневом саде все эти образы нелепой и несчастливой жизни характеризуют не современную жизнь вообще а жизнь определенного исторического периода уже закончившегося изжитого. Вишневый сад рисует не устойчивый образ жизни а ее историческое движение.
81752. Тема свободы и ее философское звучание в произведениях русской поэзии 19 века 29.57 KB
  Таков и мцыри и лирический герой стих. Парус Лермонтовский герой герой романтический мятежный поэтому страсти его всегда максимально накалены а его внутренний мир чрезвычайно сложен. Лирический герой противопоставляет себя обществу и оно не приемлет его. герой одинок как и парус в тумане моря голубом как Демон.
81753. Жанровое своеобразие и идейное звучание «Слова о полку Игореве» Связь «Слова…» с устным народным творчеством 32.87 KB
  Определив хронологический диапазонсвоего повествования от старого Владимира до нынешнего Игоря автор рассказывает о дерзком замысле Игоря навести свои полки на Половецкую землю испити шеломом Дону. В радостных тонах рисует автор встречу Игоря и Буй Тура Всеволода восторженно характеризует удалых кметей воинов курян. И хотя описывается первая победа принесшая русским князьям богатые трофеи автор вновь возвращается к теме грозных предзнаменований грядущего поражения кровавыя зори свет поведают черные тучи с моря идут...
81754. Тема любви и смерти в прозе И.А.Бунина 31.39 KB
  Бунина на примере одного произведения Рассказы Бунина о любви это повествование о ее загадочной ускользающей природе о тайне женской души которая томится жаждой любить но никогда не полюбит. Исход любви; по Бунину всегда трагичен В повести Митина любовь героя преследует романс Рубинштейна на слова Генриха Гейне: Я из рода бедных Азров Полюбив мы умираем. МуромцеваБунин а в книге Жизнь Бунина пишет о том что долгие годы Бунин носил в себе впечатление от этого романса который услышал в юношеском возрасте и в Митиной любви...
81755. Мотив дороги и его философское звучание в произведениях отечественной классики 19 века 31.76 KB
  Выражением концепции исторического пути народа или государства Н. Бричка Чичикова символ однообразного кружения сбившейся с прямого пути души русского человека. А проселочные дороги по которым эта бричка колесит не только реалистическая картина российского бездорожья но и символ кривого пути национального развития. Птицатройка символ национальной стихии русской жизни символ великого пути России в мировом масштабе.
81756. Проблема ума в комедии А.С.Грибоедова «Горе от ума». Особенности языка и стиха пьесы 36.33 KB
  В комедии Горе от ума кто умное действующее лицо ответ: Грибоедов А знаешь ли что такое Чацкий Пылкий благородный и добрый малый проведший несколько времени с очень умным человеком именно с Грибоедовым и напитавшийся его мыслями остротами и сатирическими замечаниями. Но Чацкий не только умнее всех прочих лиц но и положительно умен. Между тем Чацкий как личность несравненно выше и умнее Онегина и лермонтовского Печорина. Ими заканчивается их время а Чацкий начинает новый век и в этом все его значение и весь ум.