Автор работы: Пользователь скрыл имя, 12 Января 2014 в 01:29, курсовая работа
Написати програму, яка реалізує алгоритм арифметичного кодування-декодування, що виконує стиснення інформації. На вході програма повинна отримати файл, а на виході цей файл повинен бути закодованим. Також реалізувати декодування цього файлу. Порівняти ефективність стиснення з різними форматами файлів. Програма має виконувати такі функції:
надавати користувачу можливість кодувати та декодувати файли;
забезпечити максимальну надійність при кодуванні та декодуванні;
надавати можливість порівняння кодованого та декодованого файлу;
Головне вікно програми, яке наведено на рис. 4.1, складається з таких елементів:
Рис. 4.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
Ефективність стискання файлів за алгоритмом «Арифметичне кодування»
Розширення файлу |
Розмір файлу до кодування |
Розмір файлу після кодування |
Ефективність кодування |
.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.
Висновок
З огляду на те, що різні види
алгоритмів призначенні для різних
типів файлів, алгоритм «Арифметичне
кодування» є досить ефективним. Його
ефективність найбільше проявляється
при кодуванні текстових
Алгоритм «Арифметичне кодування» має високу надійність, тобто при декодуванні у файлі не відбувається ніяких змін.
Даний алгоритм має і недоліки, а саме: переповнення, завершення кодування і інші.
Розроблена програма є
практичною і зручною для використання.
Вона виконує дві основні функції:
кодування і декодування
Використання потоків
в даній програмі підвищило швидкість
виконання і її надійність. В програмі
реалізовані всі необхідні
Реалізоване програмне забезпечення є дуже компактним, інтуітивно зрозумілим і не потребує великих резервів комп’ютера.
Список використаної літератури
Додаток А
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.
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)
bits_to_go = 8;
}
}
//----------------------------
public void done_outputing_bits()
{
dataout.WriteByte((byte)(
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;
Информация о работе Утиліта стискання файлів за алгоритмом арифметичного кодування