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;

   }

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


 

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

47761. Кримінальний процес. Конспект лекцій 1.57 MB
  Порядок застосування інших заходів процесуального примусулекція №6 порушення кримінальної справи1. Поняття і завдання стадії порушення кримінальної справи2. Приводи і підстави для порушення кримінальної справи. Обставини що виключають порушенння кримінальної справи.
47762. Становлення культурології як самостійної галузі гуманітарного знання 133.03 KB
  Без світу культури важко собі уявити світ особистості. До культури в цілому відноситься широкий діапазон людських почуттів і думок від пошуку смислу життя до естетики. Той чи інший досягнутий рівень культури людства визначає кожен раз заново окультурення кожної народженої людини в результаті чого врештірешт відбувається окультурення людської природи. Потрібні були століття розвитку культури щоб рука сучасної людини змогла навчитися виготовляти складну техніку створювати високодосконалі твори скульптури твори живопису чи...
47763. Культура мови. Опорний конспект лекцій 2.73 MB
  Кожна людина повинна знати мову своєї держави, душею відчувати причетність до культури нації, а через свою культуру - причетність до вселюдської культури
47764. Управление персоналом и трудовые отношения 1.68 MB
  Оценка выполняемой работы. Введение схемы оценки выполняемой работы. Кроме того что данный курс слишком краток Вы просто и не должны быть таким специалистом если не посвятили себя целиком вопросам работы с кадрами. Каждая из вышеперечисленных функций включает в себя: планирование: постановка целей и стандартов разработка правил и последовательности действий разработка планов и прогнозирование некоторых возможностей в будущем; организация: постановка определенных задач перед каждым подчиненным разделение на отделы...
47765. ОРГАНИЗАЦИЯ И ТЕХНОЛОГИЯ РЕКЛАМНОЙ ДЕЯТЕЛЬНОСТИ 1.9 MB
  Данное учебное пособие по дисциплине «Организация и технология рекламной деятельности» предназначено для обучения студентов СПО третьего курса повышенного уровня обучения
47766. Курс лекцій. Історія української культури 3.28 MB
  Вивчення цього предмету повязане з необхідністю гуманізації університетської освіти поєднаних глибоких професійних звань з опануванням багатої історії культури України та людства в цілому Історія української культуриâ належить до обовязкових до вивчення в вищому навчальному закладі дисциплін. Зокрема акцентується увага на формуванні української народності та нації на етнічному складі населення сучасної України. Етнічний склад населення України
47767. Ситуаційний і диспозиційний підходи у психології особистості 259.5 KB
  Кожна людина у силу свої індивідуальних властивостей особливостей онтогенезу соціалізації стає самостійним субєктом діяльності сфера активності якого соціально обумовлена. Коли йдеться про передбачуваність поведінки то маються на увазі не окремі поведінкові реакції і не вся діяльність в цілому а вчинки і система вчинків субєктом яких є особистість як соціальна індивідуальність. Це система структурована за ступенем узагальненості від звязків особистостісубєкта до всієї дійсності до звязків з її окремими сторонами і...
47768. Загальна характеристика царства Тварин 3.62 MB
  Амеба не має постійної форми тіла що пояснюється здатністю плазми скорочуватись та відсутністю оболонки. Цисти зовні мають різноманітні випини можуть чіплятися наприклад до тіла водоплавних птахів що сприяє поширенню виду. Ектоплазма утворює пелікулу під якою містяться дуже тонкі скоротливі волоконця міонеми розміщені у напрямку поздовжньої осі тіла. Відрізняються кулястою формою тіла тонкими довгими псевдоніжками що розходяться від клітини радіально а також наявністю черепашки з карбонату кальцію та органічних речовин або...
47769. Житлове право. Курс лекцій 1.5 MB
  У вузькому значенні житлове право традиційно розглядається як частина цивільного права яка врегульовує правові відносини які виникають в процесі користування жилими приміщеннями. Так наприклад для відносин користування жилими приміщеннями характерним є цивільноправовий метод регулювання рівність сторін їх майнова самостійність; для відносин розподілу надання житла управління житловим фондом інших відносин організаційного та управлінського характеру метод адміністративноправового регулювання метод владипідпорядкованості. Таким...