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

2 чел.

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

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

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

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

Лабораторна робота №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;

   }

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


 

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

41894. Списки. Фильтрация данных. Связывание таблиц. Лабораторные работы в MS Excel 2007 1.43 MB
  Введите таблицу приведенную на рис. Рис. Введите таблицу представленную на рис. Активизируйте лист с исходной таблицей рис.
41895. ПРИНЦИПЫ ПРОГРАММНОГО УПРАВЛЕНИЯ ЭВМ. КОМАНДЫ MS DOS 683.51 KB
  В зависимости от варианта ответа DOS реагирует на возникшую ошибку поразному: аварийное завершение выполнения программы или команды выдавшей запрос; R повтор операции; F завершение выполнения операции и возврат кода ошибки; программа продолжает выполняться. Временный приостанов выполнения команды или программы например вывода информации на экран дисплея осуществляется нажатием клавиши Puse. Общие положения Тестовые программы используются для идентификации конфигурации компьютера его системных ресурсов а также для его диагностики...
41896. Emissions of combustive-lubricating materials stocks 32.01 KB
  146; Gross emissions: M=PT103 ton yer P emission per hour P is P1 or P2 T ctive time of source which cn be clculted for litting up: T=V p103 hour yer Where p= 300 m3 hour for gs; p=30 m3 hour for petrol; p=30 m3 hour for diesel fuel Min chrcteristics of wsters ccording to prgrph 17 of the lw On wstes producer determines composition nd chrcteristics of production wstes nd degree of their dnger for environment nd mn's helth. The dnger degree is coordinted with executive uthorities. Degree of dnger is chrcterized by the clss of...
41897. ДОСЛІДЖЕННЯ ПРОГРАМНОГО СЕРЕДОВИЩА РОЗРОБКИ ТА НАЛАГОДЖЕННЯ ПРИКЛАДНОГО ПРОГРАМНОГО ЗАБЕЗПЕЧЕННЯ СИСТЕМ КЕРУВАННЯ ТА ОБРОБКИ ІНФОРМАЦІЇ, ВИКОНАНИХ НА БАЗІ МІКРОПРОЦЕСОРІВ СІМЕЙСТВА MCS-51 2.48 MB
  Провести асемлеювання програми. Текст програми.1 ; надання імені vr_3 першому біту регістру RM 20H ; ; Програма ; ORG H ; адреса вектора розгалуження після початкового пуску RJMP _BEGIN ; мікропроцесора ; ORG H...
41898. ИТЕРАЦИОННЫЕ МЕТОДЫ РЕШЕНИЯ НЕЛИНЕЙНЫХ УРАВНЕНИЙ 251.24 KB
  Метод Ньютона. В качестве начального приближения здесь выбирается правый или левый конец отрезка в зависимости от того в котором выполняется достаточное условие сходимости метода Ньютона вида: Условие выполняется на обоих концах отрезка следовательно в качестве начального приближения разрешено выбрать любой из них. Рабочая формула метода Ньютона для данного уравнения запишется так: Условия выхода итерационного процесса аналогичны условиям метода простых итераций: и . Модифицированный метод Ньютона.
41899. ИТЕРАЦИОННЫЕ МЕТОДЫ РЕШЕНИЯ СИСТЕМ НЕЛИНЕЙНЫХ УРАВНЕНИЙ. МЕТОД НЬЮТОНА 213.45 KB
  Цель работы: научиться решать системы нелинейных уравнений СНУ методом простых итераций МПИ и методом Ньютона с помощью ЭВМ. Изучить МПИ и метод Ньютона для решения систем нелинейных уравнений. На конкретном примере усвоить порядок решения систем нелинейных уравнений МПИ и методом Ньютона с помощью ЭВМ. Построить рабочие формулы МПИ и метода Ньютона для численного решения системы при начальном приближении: .
41900. ИТЕРАЦИОННЫЕ МЕТОДЫ РЕШЕНИЯ СИСТЕМ ЛИНЕЙНЫХ АЛГЕБРАИЧЕСКИХ УРАВНЕНИЙ 244.14 KB
  Цель работы: научиться решать системы линейных алгебраических уравнений СЛАУ методом простых итераций МПИ и методом Зейделя с помощью ЭВМ. Изучить метод простых итераций и метод Зейделя для решения СЛАУ. Сравнить скорости сходимости метода простых итераций и метода Зейделя. Построить рабочие формулы МПИ и метода Зейделя для численного решения системы.
41901. Знакомство со средой разработки Oracle Application Express. Создание исходного приложения 1.09 MB
  Знакомство со средой разработки Orcle ppliction Express. Каковы основные компоненты среды разработки Orcle ppliction Express ppliction Builder – собственно среда разработки webстраниц и бизнесправил. Что такое рабочая область workspce Рабочая область workspce – это виртуальная частная база данных которая позволяет множеству пользователей работать с одной инсталляцией Orcle ppliction Express обеспечивая при этом приватность пользовательских объектов и приложений.
41902. Построение графиков в среде программирования MATLAB 354.21 KB
  Цель работы: научиться строить графики различных типов в программной среде MATLAB. Изучить основные операторы построения графиков в среде программирования MATLAB; освоить принципы построения различных типов графиков в среде программирования MATLAB.