using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Сжатие_RLE
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
///
/// упаковка файла в архив
///
/// исходный файл
/// упакованный файл
///
/// код ошибки
/// 0 - ошибок не возникло
/// 1 - исходный файл для упаковки не найден
/// 2 - архивный файл невозможно открыть для записи
///
// исходный массив
byte[] GeneratedList = new byte[15];
// упакованный массив
byte[] PackedList = new byte[31];
// буфер в ОЗУ
List bt = new List();
// позиция генерированного массива
long Position = 0;
// позиция генерированного массива
byte Counter = 1;
// позиция упакованного массива
long PackPosition = 0;
private void btnPack_Click(object sender, EventArgs e)
{
// длина исходного файла в байтах
long len = GeneratedList.Length;
// перебор байт в исходном файле
if (Position < len)
{
byte b = GeneratedList[Position];
// если буфер пустой, то добавить байт в буфер
if (bt.Count == 0)
{
bt.Add(b);
}
else
{
if (b == bt[0])
{
Counter++;
}
else
{
//сброс в архив
PackedList[PackPosition] = Counter;
PackPosition++;
PackedList[PackPosition] = bt[0];
PackPosition++;
bt.Clear();
bt.Add(b);
Counter = 1;
}
}
Position++;
}
if (Position == len)
{
btnPack.Text = "Завершено";
//сброс в архив
PackedList[PackPosition] = Counter;
PackedList[PackPosition + 1] = bt[0];
}
//Вывод данных
string GeneratedString = "";
for (int i = 0; i < 15; i++)
{
if (i == Position)
{
GeneratedString += "_" + GeneratedList[i].ToString() + "_" + " ";
}
else
{
GeneratedString += GeneratedList[i].ToString() + " ";
}
}
lblGenerate.Text = GeneratedString;
GeneratedString = "";
long LastShowPos = PackPosition;
if (Position == len)
{
LastShowPos = PackPosition + 2;
}
for (int i = 0; i < LastShowPos; i++)
{
GeneratedString += PackedList[i].ToString() + " ";
}
lblPack.Text = GeneratedString;
lblPosition.Text = "Позиция: " + Position.ToString();
lblCounter.Text = "Счетчик: " + Counter.ToString();
lblBuf.Text = "Буфер: " + bt[0].ToString();
//while (Position < len)
//{
// // прочитать из исходного файла очередной байт
// byte b = GeneratedList[Position];
// // если буфер пустой, то добавить байт в буфер
// if (bt.Count == 0)
// bt.Add(b);
// else // если в буфере что-то есть
// {
// // если прочитанный байт не совпадает с последним байтом в буфере
// if (b != bt.Last())
// {
// bt.Add(b); // добавить прочитанный байт в буфер
// // если в буфере накопилось 255 байт
// if (bt.Count == 255)
// {
// //bw.Write((byte)0);
// PackedList[PackPosition] = (byte)0;
// PackPosition++;
// //bw.Write((byte)255);
// PackedList[PackPosition] = (byte)255;
// PackPosition++;
// // bw.Write(bt.ToArray(), нач, кол-во);
// //bw.Write(bt.ToArray(), 0, bt.Count);
// for(int i=0; i 1)
// {
// // вывести в архивный файл 0 и длину цепочки без повторов
// //bw.Write((byte)0);
// PackedList[PackPosition] = (byte)0;
// PackPosition++;
// //bw.Write((byte)(bt.Count - 1));
// PackedList[PackPosition] = (byte)(bt.Count - 1);
// PackPosition++;
// // вывести в архивный файл содержимое буфера от 0 до предпоследнего байта
// //bw.Write(bt.ToArray(), 0, bt.Count - 1);
// for (int i = 0; i < bt.Count; i++)
// {
// PackedList[PackPosition] = bt[i];
// PackPosition++;
// }
// // удалить в буфере все элементы от 0 до предпоследнего
// bt.RemoveRange(0, bt.Count - 1);
// }
// bt.Add(b); // добавить в буфер текущий байт
// // если файл не закончился
// if (Position < len)
// {
// // пока прочитанный байт равен последнему байту в буфере
// //while ((b = br.ReadByte()) == bt.Last())
// while (((b = GeneratedList[Position + 1]) == bt.Last()))
// {
// Position++;
// bt.Add(b); // добавить байт в буфер
// // в буфере накопилось 255 одинаковых байт
// if (bt.Count == 255)
// {
// // вывести кол-во повторяющихся байт
// //bw.Write((byte)255);
// PackedList[PackPosition] = (byte)255;
// PackPosition++;
// //bw.Write(b); // вывести повторяющийся байт
// PackedList[PackPosition] = b;
// PackPosition++;
// bt.Clear(); // очистить буфер
// break; // выйти из цикла
// }
// // если байты в файле закончились, то выйти из цикла
// if (Position == len)
// break;
// }
// }
// // если буфер не пустой (т.е. в нем есть повторяющиеся байты кол-вом менее 255)
// if (bt.Count > 0)
// {
// // вывести длину цепочки с повторами и сам повторяющийся байт
// //bw.Write((byte)bt.Count);
// PackedList[PackPosition] = (byte)bt.Count;
// PackPosition++;
// //bw.Write(bt.Last());
// PackedList[PackPosition] = bt.Last();
// PackPosition++;
// bt.Clear(); // очистить буфер
// // если еще не дошли до конца файла, добавить текущий байт в буфер
// if (Position < len)
// bt.Add(b);
// }
// }
// }
//}
//// === ЗАКОНЧИЛСЯ ПЕРЕБОР БАЙТ В ИСХОДНОМ ФАЙЛЕ ===
//// если после перебора байт в буфере что-то есть, то это будет цепочка байт без повтора
//if (bt.Count > 0)
//{
// //bw.Write((byte)0);
// PackedList[PackPosition] = (byte)0;
// PackPosition++;
// //bw.Write((byte)bt.Count);
// PackedList[PackPosition] = (byte)bt.Count;
// PackPosition++;
// //bw.Write(bt.ToArray(), 0, bt.Count);
//}
}
private void btnUnPack_Click(object sender, EventArgs e)
{
openFile.Filter = "Архивные файлы|*.pack|Все файлы|*.*";
if (openFile.ShowDialog() == DialogResult.OK)
{
//UnPack(openFile.FileName);
MessageBox.Show("Распаковка файла из архива закончена", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btnGenerate_Click(object sender, EventArgs e)
{
Random RND = new Random();
//заполняем случайными числами
for (int i = 0; i < 12; i++)
{
GeneratedList[i] = (byte)(RND.Next());
// дополняем повторениями
if ((GeneratedList[i] % 2) == 0)
{
GeneratedList[i + 1] = GeneratedList[i];
i++;
}
if ((GeneratedList[i] % 3) == 0)
{
GeneratedList[i + 1] = GeneratedList[i];
GeneratedList[i + 2] = GeneratedList[i];
i++;
i++;
}
}
//выводим на форму
string GeneratedString = "";
for (int i = 0; i < 15; i++)
{
GeneratedString += GeneratedList[i].ToString() + " ";
}
lblGenerate.Text = GeneratedString;
}
}
}