Form1.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. namespace Сжатие_RLE
  12. {
  13. public partial class Form1 : Form
  14. {
  15. public Form1()
  16. {
  17. InitializeComponent();
  18. }
  19. /// <summary>
  20. /// упаковка файла в архив
  21. /// </summary>
  22. /// <param name="fileSource">исходный файл</param>
  23. /// <param name="filePack">упакованный файл</param>
  24. /// <param name="err">
  25. /// код ошибки
  26. /// 0 - ошибок не возникло
  27. /// 1 - исходный файл для упаковки не найден
  28. /// 2 - архивный файл невозможно открыть для записи
  29. /// </param>
  30. // исходный массив
  31. byte[] GeneratedList = new byte[15];
  32. // упакованный массив
  33. byte[] PackedList = new byte[31];
  34. // буфер в ОЗУ
  35. List<byte> bt = new List<byte>();
  36. // позиция генерированного массива
  37. long Position = 0;
  38. // позиция генерированного массива
  39. byte Counter = 1;
  40. // позиция упакованного массива
  41. long PackPosition = 0;
  42. private void btnPack_Click(object sender, EventArgs e)
  43. {
  44. // длина исходного файла в байтах
  45. long len = GeneratedList.Length;
  46. // перебор байт в исходном файле
  47. if (Position < len)
  48. {
  49. byte b = GeneratedList[Position];
  50. // если буфер пустой, то добавить байт в буфер
  51. if (bt.Count == 0)
  52. {
  53. bt.Add(b);
  54. }
  55. else
  56. {
  57. if (b == bt[0])
  58. {
  59. Counter++;
  60. }
  61. else
  62. {
  63. //сброс в архив
  64. PackedList[PackPosition] = Counter;
  65. PackPosition++;
  66. PackedList[PackPosition] = bt[0];
  67. PackPosition++;
  68. bt.Clear();
  69. bt.Add(b);
  70. Counter = 1;
  71. }
  72. }
  73. Position++;
  74. }
  75. if (Position == len)
  76. {
  77. btnPack.Text = "Завершено";
  78. //сброс в архив
  79. PackedList[PackPosition] = Counter;
  80. PackedList[PackPosition + 1] = bt[0];
  81. }
  82. //Вывод данных
  83. string GeneratedString = "";
  84. for (int i = 0; i < 15; i++)
  85. {
  86. if (i == Position)
  87. {
  88. GeneratedString += "_" + GeneratedList[i].ToString() + "_" + " ";
  89. }
  90. else
  91. {
  92. GeneratedString += GeneratedList[i].ToString() + " ";
  93. }
  94. }
  95. lblGenerate.Text = GeneratedString;
  96. GeneratedString = "";
  97. long LastShowPos = PackPosition;
  98. if (Position == len)
  99. {
  100. LastShowPos = PackPosition + 2;
  101. }
  102. for (int i = 0; i < LastShowPos; i++)
  103. {
  104. GeneratedString += PackedList[i].ToString() + " ";
  105. }
  106. lblPack.Text = GeneratedString;
  107. lblPosition.Text = "Позиция: " + Position.ToString();
  108. lblCounter.Text = "Счетчик: " + Counter.ToString();
  109. lblBuf.Text = "Буфер: " + bt[0].ToString();
  110. //while (Position < len)
  111. //{
  112. // // прочитать из исходного файла очередной байт
  113. // byte b = GeneratedList[Position];
  114. // // если буфер пустой, то добавить байт в буфер
  115. // if (bt.Count == 0)
  116. // bt.Add(b);
  117. // else // если в буфере что-то есть
  118. // {
  119. // // если прочитанный байт не совпадает с последним байтом в буфере
  120. // if (b != bt.Last())
  121. // {
  122. // bt.Add(b); // добавить прочитанный байт в буфер
  123. // // если в буфере накопилось 255 байт
  124. // if (bt.Count == 255)
  125. // {
  126. // //bw.Write((byte)0);
  127. // PackedList[PackPosition] = (byte)0;
  128. // PackPosition++;
  129. // //bw.Write((byte)255);
  130. // PackedList[PackPosition] = (byte)255;
  131. // PackPosition++;
  132. // // bw.Write(bt.ToArray(), нач, кол-во);
  133. // //bw.Write(bt.ToArray(), 0, bt.Count);
  134. // for(int i=0; i<bt.Count; i++)
  135. // {
  136. // PackedList[PackPosition] = bt[i];
  137. // PackPosition++;
  138. // }
  139. // bt.Clear();
  140. // }
  141. // }
  142. // else // т.е., если прочитанный байт совпадает с последним байтом в буфере
  143. // {
  144. // // если в буфере только один байт, то это последний байт из цепочки повторяющихся
  145. // if (bt.Count > 1)
  146. // {
  147. // // вывести в архивный файл 0 и длину цепочки без повторов
  148. // //bw.Write((byte)0);
  149. // PackedList[PackPosition] = (byte)0;
  150. // PackPosition++;
  151. // //bw.Write((byte)(bt.Count - 1));
  152. // PackedList[PackPosition] = (byte)(bt.Count - 1);
  153. // PackPosition++;
  154. // // вывести в архивный файл содержимое буфера от 0 до предпоследнего байта
  155. // //bw.Write(bt.ToArray(), 0, bt.Count - 1);
  156. // for (int i = 0; i < bt.Count; i++)
  157. // {
  158. // PackedList[PackPosition] = bt[i];
  159. // PackPosition++;
  160. // }
  161. // // удалить в буфере все элементы от 0 до предпоследнего
  162. // bt.RemoveRange(0, bt.Count - 1);
  163. // }
  164. // bt.Add(b); // добавить в буфер текущий байт
  165. // // если файл не закончился
  166. // if (Position < len)
  167. // {
  168. // // пока прочитанный байт равен последнему байту в буфере
  169. // //while ((b = br.ReadByte()) == bt.Last())
  170. // while (((b = GeneratedList[Position + 1]) == bt.Last()))
  171. // {
  172. // Position++;
  173. // bt.Add(b); // добавить байт в буфер
  174. // // в буфере накопилось 255 одинаковых байт
  175. // if (bt.Count == 255)
  176. // {
  177. // // вывести кол-во повторяющихся байт
  178. // //bw.Write((byte)255);
  179. // PackedList[PackPosition] = (byte)255;
  180. // PackPosition++;
  181. // //bw.Write(b); // вывести повторяющийся байт
  182. // PackedList[PackPosition] = b;
  183. // PackPosition++;
  184. // bt.Clear(); // очистить буфер
  185. // break; // выйти из цикла
  186. // }
  187. // // если байты в файле закончились, то выйти из цикла
  188. // if (Position == len)
  189. // break;
  190. // }
  191. // }
  192. // // если буфер не пустой (т.е. в нем есть повторяющиеся байты кол-вом менее 255)
  193. // if (bt.Count > 0)
  194. // {
  195. // // вывести длину цепочки с повторами и сам повторяющийся байт
  196. // //bw.Write((byte)bt.Count);
  197. // PackedList[PackPosition] = (byte)bt.Count;
  198. // PackPosition++;
  199. // //bw.Write(bt.Last());
  200. // PackedList[PackPosition] = bt.Last();
  201. // PackPosition++;
  202. // bt.Clear(); // очистить буфер
  203. // // если еще не дошли до конца файла, добавить текущий байт в буфер
  204. // if (Position < len)
  205. // bt.Add(b);
  206. // }
  207. // }
  208. // }
  209. //}
  210. //// === ЗАКОНЧИЛСЯ ПЕРЕБОР БАЙТ В ИСХОДНОМ ФАЙЛЕ ===
  211. //// если после перебора байт в буфере что-то есть, то это будет цепочка байт без повтора
  212. //if (bt.Count > 0)
  213. //{
  214. // //bw.Write((byte)0);
  215. // PackedList[PackPosition] = (byte)0;
  216. // PackPosition++;
  217. // //bw.Write((byte)bt.Count);
  218. // PackedList[PackPosition] = (byte)bt.Count;
  219. // PackPosition++;
  220. // //bw.Write(bt.ToArray(), 0, bt.Count);
  221. //}
  222. }
  223. private void btnUnPack_Click(object sender, EventArgs e)
  224. {
  225. openFile.Filter = "Архивные файлы|*.pack|Все файлы|*.*";
  226. if (openFile.ShowDialog() == DialogResult.OK)
  227. {
  228. //UnPack(openFile.FileName);
  229. MessageBox.Show("Распаковка файла из архива закончена", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Information);
  230. }
  231. }
  232. private void btnGenerate_Click(object sender, EventArgs e)
  233. {
  234. Random RND = new Random();
  235. //заполняем случайными числами
  236. for (int i = 0; i < 12; i++)
  237. {
  238. GeneratedList[i] = (byte)(RND.Next());
  239. // дополняем повторениями
  240. if ((GeneratedList[i] % 2) == 0)
  241. {
  242. GeneratedList[i + 1] = GeneratedList[i];
  243. i++;
  244. }
  245. if ((GeneratedList[i] % 3) == 0)
  246. {
  247. GeneratedList[i + 1] = GeneratedList[i];
  248. GeneratedList[i + 2] = GeneratedList[i];
  249. i++;
  250. i++;
  251. }
  252. }
  253. //выводим на форму
  254. string GeneratedString = "";
  255. for (int i = 0; i < 15; i++)
  256. {
  257. GeneratedString += GeneratedList[i].ToString() + " ";
  258. }
  259. lblGenerate.Text = GeneratedString;
  260. }
  261. }
  262. }