/// <Архівування> /// Виконання архівування за допомогою алгоритму RLE (Кодування повторів). /// </Архівування> /// <param name="source">Масив даних</param> public static void Compress(ref byte[] source) { int offset = 0; Encoder(ref source, ref offset); int size = source.Length; List<byte> tmpSource = new List<byte>(); List<byte> tmpCount = new List<byte>(); /* int count = 0; for (int i = 0; i < size - 1; i++) { if (!source[i].Equals(source[i + 1])) { tmpSource.Add(source[i]); tmpCount.Add((byte)count); count = 0; } count++; } tmpSource.Add(source[size - 1]); tmpCount.Add(Convert.ToByte(count)); tmpSource.AddRange(tmpCount);*/ RLE rleEncode = new RLE(); source = rleEncode.EncodeData(source); tmpSource.AddRange(source); // Запис індексу оригінального рядку. byte[] tmpOffset = BitConverter.GetBytes((ushort)offset); tmpSource.AddRange(tmpOffset); source = tmpSource.ToArray(); }
/// <Розпакування> /// Виконання розпакування за допомогою алгоритму RLE (Кодування повторів). /// </Розпакування> /// <param name="source">Масив даних</param> public static void Decompress(ref byte[] source) { #region Зчитування і видалення індексу оригінального рядку int size = source.Length; List<byte> tmpSource = new List<byte>(source); int offset = (int)BitConverter.ToUInt16(tmpSource.ToArray(), (size - 2)); tmpSource.RemoveAt(size - 2); tmpSource.RemoveAt(size - 2); source = tmpSource.ToArray(); #endregion tmpSource.Clear(); size -= 2; /* for (int i = 0; i < size / 2; i++) { int j = 0; do { tmpSource.Add(source[i]); j++; } while (j < (source[i + size / 2])); } source = tmpSource.ToArray(); */ RLE rleDecode = new RLE(); source = rleDecode.DecodeData(source); Decoder(ref source, offset); }