示例#1
0
        protected void Encrypt(InnerFile file)
        {
            int         dataSize         = BitConverter.ToInt32(file.header.uncompressedSize, 0);
            List <byte> data             = new List <byte>(file.data);
            List <byte> encryptionHeader = new List <byte>();
            List <byte> encryptedData    = new List <byte>();
            int         blockCounter     = 0;

            for (int counter = 0; counter < dataSize; blockCounter++)
            {
                int blockLength = rnd.Next(1, 17);
                if (counter + blockLength > dataSize)
                {
                    blockLength = dataSize - counter;
                }
                encryptionHeader.Add((byte)blockLength);
                encryptedData.AddRange(data.GetRange(counter, blockLength));
                counter += blockLength; // индекс исходных данных
                encryptedData.Add((byte)'q');
                // 4 байта отвечают за порядковый номер блока
                encryptedData.AddRange(BitConverter.GetBytes(blockCounter));
            }

            file.data                  = encryptedData.ToArray();
            file.encryptionHeader      = encryptionHeader.ToArray();
            file.header.compressedSize = BitConverter.GetBytes(encryptedData.Count);
            file.header.fileDataOffset = BitConverter.GetBytes(encryptionHeader.Count);
            file.header.symTableOffset = BitConverter.GetBytes(encryptionHeader.Count);
        }
示例#2
0
        protected void CompressWithArythmetic(InnerFile file)
        {
            int dataSize = 0;

            int compressedSize = BitConverter.ToInt32(file.header.compressedSize, 0);

            if (compressedSize == 0)
            {
                dataSize = BitConverter.ToInt32(file.header.uncompressedSize, 0);
            }
            else
            {
                dataSize = compressedSize;
            }

            List <byte> newdata = new List <byte>();
            List <byte> data    = new List <byte>(file.data);

            for (int i = 0; i < data.Count; i++)
            {
                byte symcounter = 1;
                for (int j = i + 1; j < data.Count; j++)
                {
                    if (data[j] == data[i])
                    {
                        symcounter++;
                        i = j;
                    }
                    else
                    {
                        break;
                    }
                }

                if (symcounter > 1)
                {
                    //newdata.Add((byte)'^');
                    newdata.Add(symcounter);
                }
                newdata.Add(data[i]);
            }

            file.data = newdata.ToArray();
            file.header.compressedSize = BitConverter.GetBytes(newdata.Count);
        }
示例#3
0
        protected void CompressWithFano(InnerFile file)
        {
            int dataSize = 0;

            int compressedSize = BitConverter.ToInt32(file.header.compressedSize, 0);

            if (compressedSize == 0)
            {
                dataSize = BitConverter.ToInt32(file.header.uncompressedSize, 0);
            }
            else
            {
                dataSize = compressedSize;
            }

            List <byte> data = new List <byte>(file.data);
            ShannonFano sfc  = new ShannonFano(data);
            Dictionary <byte, string> symCode = sfc.GetTable();

            // конвертируем таблицу кодов в массив
            // первый байт - символ
            // второй байт - длина кода символа
            // последовательность байтов - код символа
            List <byte> symCodeArr = new List <byte>();

            foreach (KeyValuePair <byte, string> entry in symCode)
            {
                symCodeArr.Add(entry.Key);
                symCodeArr.Add(Convert.ToByte(entry.Value.Length));
                symCodeArr.AddRange(Encoding.UTF8.GetBytes(entry.Value));
            }
            file.symCodeTable = symCodeArr.ToArray();

            //
            // переводим исходные данные в массив битов //
            //
            List <bool> compressedData = new List <bool>();

            foreach (byte b in file.data)
            {
                //Console.Write((char)b);
                foreach (char c in symCode[b])
                {
                    if (c == '1')
                    {
                        compressedData.Add(true);
                    }
                    else
                    {
                        compressedData.Add(false);
                    }
                }
            }
            BitArray bits = new BitArray(compressedData.ToArray());

            //
            // затем переводим биты в байты //
            //
            byte[] newData = new byte[(bits.Length - 1) / 8 + 1];
            bits.CopyTo(newData, 0);

            file.data = newData;
            file.header.compressedSize = BitConverter.GetBytes(newData.Length);
            file.header.fileDataOffset = BitConverter.GetBytes(file.symCodeTable.Length);
        }