Утиліта стискання файлів за алгоритмом арифметичного кодування

Автор работы: Пользователь скрыл имя, 12 Января 2014 в 01:29, курсовая работа

Краткое описание

Написати програму, яка реалізує алгоритм арифметичного кодування-декодування, що виконує стиснення інформації. На вході програма повинна отримати файл, а на виході цей файл повинен бути закодованим. Також реалізувати декодування цього файлу. Порівняти ефективність стиснення з різними форматами файлів. Програма має виконувати такі функції:
надавати користувачу можливість кодувати та декодувати файли;
забезпечити максимальну надійність при кодуванні та декодуванні;
надавати можливість порівняння кодованого та декодованого файлу;

Прикрепленные файлы: 1 файл

КУРСОВА з СПЗ.docx

— 396.58 Кб (Скачать документ)
  1. Останнім кроком роботи програми є закриття вхідного та вихідного файлу, та визначення розміру вихідного файлу функцією GetFileSizeEx();

 

  1. Опис інтерфейсу та тестування програми
    1. Опис інтерфейсу програми

Головне вікно програми, яке наведено на рис. 4.1, складається з таких елементів:

  1. Поле де вводиться шлях до файлу, який користувач бажає стиснути (задати його можна натиснувши на кнопку справа над полем).
  2. Поле де вводить шлях до вихідного (стиснутого) файлу (задати його можна, також, натиснувши на кнопку зверху справа над полем).
  3. Кнопка «кодувати», при натисненні на яку, відбувається кодування файлу.
  4. Кнопка «декодувати», при натисненні на яку, відбувається декодування файлу.
  5. Два прапорці:
    1. кодування з видаленням поточного файлу: якщо цей прапорець знаходиться в активному стані, то після закінчення кодування, вхідний файл буде видалено;
    2. декодування з видаленням поточного файлу: якщо цей прапорець знаходиться в активному стані, то після закінчення декодування, вхідний файл буде видалено;
  6. В поле «Процес» виводиться інформація про стан виконання (коли процес буде завершено, в полі з’явиться надпис «Завершено»).
  7. Група полів «Інформація про результати». Складається з трьох полів:
    1. Розмір файлу – виводиться інформація про розмір вхідного файлу;
    2. Розмір закодованого файлу – виводиться інформація про розмір вихідного файлу;
    3. Ефективність стискання – виводиться інформація про ефективність стискання(різниця між розміром вхідного файлу і вихідного).

 

Рис. 4.1 Головне вікно програми

    1. Тестування програми

Тестування проводилося  з текстовим файлом TEST.txt, розмір якого дорівнює 36.9Мб.

На рис. 4.2 зображено 1 етап: відкривання файлу, який ми бажаємо стиснути.

На рис. 4.3 зображено 2 етап: створення вихідного файлу.

На рис. 4.4 зображено вікно програми в процесі стискання.

На рис. 4.5 зображено кінцевий результат стискання.

На рис. 4.6 зображено кінцевий результат декодування.

Рис. 4.2 Відкривання вхідного файлу

Рис. 4.3 Створення вихідного  файлу

Рис. 4.4 Головне вікно програми в процесі стискання файлу

Рис. 4.5 Головне вікно програми після завершення стискання файлу

Рис. 4.6 Головне вікно програми після завершення декодування файлу

    1. Ефективність стискання файлів за алгоритмом «Арифметичне кодування»

 Ефективність дії алгоритму «Арифметичне кодування» наведено в таблиці 1.

Таблиця 1

Ефективність стискання  файлів за алгоритмом «Арифметичне кодування»

Розширення файлу

Розмір файлу до кодування

Розмір файлу після  кодування

Ефективність кодування

.txt

36.9Мб

25.3Мб

11.6Мб

.doc

2.06Мб

1.93Мб

0.13Мб

.mp3

8.5Мб

8.36Мб

0.14Мб

.jpg

1.21Мб

1.2Мб

0.1Мб


 

З результатів, які наведені в таблиці 1, можемо зробити висновок, що найкраще стискаються текстові файли з розширенням .txt.

 

 

Висновок

З огляду на те, що різні види алгоритмів призначенні для різних типів файлів, алгоритм «Арифметичне кодування» є досить ефективним. Його ефективність найбільше проявляється при кодуванні текстових файлів. При цьому, файли можуть бути стиснені в два або і в три рази.

Алгоритм «Арифметичне кодування» має високу надійність, тобто при  декодуванні у файлі не відбувається ніяких змін.

Даний алгоритм має і недоліки, а саме: переповнення, завершення кодування і інші.

Розроблена програма є  практичною і зручною для використання. Вона виконує дві основні функції: кодування і декодування файлів.  Також програма має декілька додаткових функцій, а саме: видалення вхідного файлу після кодування та видалення вхідного файлу після декодування.

Використання потоків  в даній програмі підвищило швидкість  виконання і її надійність. В програмі реалізовані всі необхідні функції, такі як: кодування, декодування, видалення  вхідного файлу після кодування  і видалення вхідного файлу після  декодування. З результатів проведеного тестування, можна зробити висновок, що найкраще стискаються текстові файли з розширенням «.txt», найгірше – графічні файли.

Реалізоване програмне забезпечення є дуже компактним, інтуітивно зрозумілим і не потребує великих резервів комп’ютера.

 

Список використаної літератури

  1. Кричевский Р. Е. Сжатие и поиск информации., Москва, 1989 г.
  2. Кохманюк Д. Сжатие информации: как это делаеться., IndexPRO, Киев, №№1,2.
  3. Рябко Б.Я. Сжатие информации спомощью стопки книг. // Проблемы передачи информации.- 1980, т.16, №4. С.16-21.
  4. Чарльз Петцольд «Программирование в тональности C#» – Москва, 2004– 534 с.
  5. http://www.cyberforum.ru/csharp-net/ - Форум программистов и сисадминов CyberForum.ru «C#.Net».
  6. http://msdn.microsoft.com/ru-ru/library/default.aspx - MSDN Library.
  7. http://posibnyky.vntu.edu.ua/e_s/563.htm - Електронні системи: арифметичне кодування.

 

Додаток А

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.IO;

using System.Diagnostics;

using System.Threading;

using System.Runtime.InteropServices;

 

 

 

namespace ArithmeticCoding

{

    public partial class Form1 : Form

    {

        System.Threading.Thread SizeThread;

        [DllImport("kernel32.dll", SetLastError = true)]

        internal static extern bool GetFileSizeEx(IntPtr hFile, out long lpFileSize);

        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]

        static extern IntPtr CreateFile(

            string lpFileName,

            [MarshalAs(UnmanagedType.U4)] FileAccess dwDesiredAccess,

            [MarshalAs(UnmanagedType.U4)] FileShare dwShareMode,

            IntPtr lpSecurityAttributes,

            [MarshalAs(UnmanagedType.U4)] FileMode dwCreationDisposition,

            [MarshalAs(UnmanagedType.U4)] FileAttributes dwFlagsAndAttributes,

            IntPtr hTemplateFile);

        [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true, ExactSpelling = true)]

        internal static extern int CloseHandle(IntPtr hObject);

        int counter = 0;

       

        const int bits_in_register = 16;

       

        const int top_value = (int)(((long)1 << bits_in_register) - 1);

       

        const int first_qtr = (top_value / 4 + 1);

        const int half = (2 * first_qtr);

        const int third_qtr = (3 * first_qtr);

       

        const int no_of_chars = 256;

       

        const int eof_symbol = (no_of_chars + 1);

       

        const int no_of_symbols = (no_of_chars + 1);

       

        const int max_frequency = 16383;

       

        public int[] index_to_char = new int[no_of_symbols];

        public int[] char_to_index = new int[no_of_chars];

       

        public int[] cum_freq = new int[no_of_symbols + 1];

        public int[] freq = new int[no_of_symbols + 1];

       

        public static long low, high;

        public static long value;

       

        public static long bits_to_follow;

       

        public static int buffer;

       

        public static int bits_to_go;

       

        public static int garbage_bits;

       

        FileStream datain;

       

        FileStream dataout;

        //--------------------------------------------------------------

       

        public void start_model()

        {

            int i;

           

            for (i = 0; i < no_of_chars; i++)

            {

                char_to_index[i] = i + 1;

                index_to_char[i + 1] = i;

            }

           

            for (i = 0; i <= no_of_symbols; i++)

            {

                freq[i] = 1;

                cum_freq[i] = no_of_symbols - i;

            }

            freq[0] = 0;           

        }

        //------------------------------------------------------------

       

        void update_model(int symbol)

        {

           

            int i;

            int ch_i, ch_symbol;

            int cum;

           

            if (cum_freq[0] == max_frequency)

            {

                cum = 0;

                for (i = no_of_symbols; i >= 0; i--)

                {

                    freq[i] = (freq[i] + 1) / 2;

                    cum_freq[i] = cum;

                    cum += freq[i];

                }

            }

           

            for (i = symbol; freq[i] == freq[i - 1]; i--) ;

            if (i < symbol)

            {

                ch_i = index_to_char[i];

                ch_symbol = index_to_char[symbol];

                index_to_char[i] = ch_symbol;

                index_to_char[symbol] = ch_i;

                char_to_index[ch_i] = symbol;

                char_to_index[ch_symbol] = i;

            }

           

            freq[i] += 1;

           

            while (i > 0)

            {

                i -= 1;

                cum_freq[i] += 1;

            }

           

        }

        //------------------------------------------------------------

       

        void start_inputing_bits()

        {

            bits_to_go = 0;

            garbage_bits = 0;

        }

        //------------------------------------------------------------

       

        int input_bit()

        {

            int t;

           

            if (bits_to_go == 0)

            {

                buffer = datain.ReadByte();

                if (buffer == -1)

                {

                   

                    garbage_bits += 1;

                    if (garbage_bits > bits_in_register - 2)

                    {

                        Application.Exit();

                    }

                                    }

                bits_to_go = 8;

            }

           

            t = buffer & 1;

            buffer >>= 1;

            bits_to_go -= 1;

            return t;

        }

        //------------------------------------------------------------

       

        public void start_outputing_bits()

        {

            buffer = 0;

            bits_to_go = 8;

            counter += 20;

            textBox6.Text = "20%";

        }

        //------------------------------------------------------------

       

        public void output_bit(int bit)

        {

           

            buffer >>= 1;

            if (bit == 1)

                buffer |= 0x80;

            bits_to_go -= 1;

           

            if (bits_to_go == 0)

            {

                dataout.WriteByte((byte)buffer);

                bits_to_go = 8;

            }

        }

        //------------------------------------------------------------

       

        public void done_outputing_bits()

        {

            dataout.WriteByte((byte)(buffer >> bits_to_go));

            counter += 20;

            textBox6.Text = "30%";

        }

        //------------------------------------------------------------

       

        public void output_bit_plus_follow(int bit)

        {

            output_bit(bit);

            while (bits_to_follow > 0)

            {

                output_bit(~bit + 2);

                bits_to_follow--;

            }

        }

        //------------------------------------------------------------

       

        public void start_encoding()

        {

           

            low = 0L;

            high = top_value;

            bits_to_follow = 0L;

            counter += 20;

            textBox6.Text = "40%";

        }

        //------------------------------------------------------------

       

        public void done_encoding()

        {

           

            bits_to_follow++;

            if (low < first_qtr)

                output_bit_plus_follow(0);

            else

                output_bit_plus_follow(1);

            counter += 20;

            textBox6.Text = "50%";

        }

        //------------------------------------------------------------

       

       

        void start_decoding()

        {

            int i;

            int a;

            value = 0L;

           

            for (i = 1; i <= bits_in_register; i++)

            {

                a = input_bit();

                value = 2 * value + a;

            }

           

            low = 0L;

            high = top_value;

        }

        //------------------------------------------------------------

       

        public void encode_symbol(int symbol)

        {

           

            long range;

Информация о работе Утиліта стискання файлів за алгоритмом арифметичного кодування