Пример #1
0
        /// <Архівування>
        /// Виконання архівування за допомогою алгоритму 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();
        }
Пример #2
0
        /// <Розпакування>
        /// Виконання розпакування за допомогою алгоритму 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);
        }