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); }
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); }
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); }