public bool Decompress(string SourceFile, string DestFile) { int BytePos = 0; byte BitPos = 0; StreamReader Reader = new StreamReader(SourceFile); byte[] CompressData = new byte[Reader.BaseStream.Length]; Reader.BaseStream.Read(CompressData, 0, (int)Reader.BaseStream.Length); Reader.Close(); // чтение длины результирующего файла int Length = 0; Length |= (int)CompressData[BytePos++] << 24; Length |= (int)CompressData[BytePos++] << 16; Length |= (int)CompressData[BytePos++] << 8; Length |= (int)CompressData[BytePos++]; Data = new byte[Length]; // чтение таблицы символов //Tree.ReadHeader(CompressData, ref BytePos, ref BitPos); MeetingBytes = new ByteCount[CompressData[BytePos++]]; for (int i = 0; i < MeetingBytes.Length; i++) { MeetingBytes[i] = new ByteCount(CompressData[BytePos++], (CompressData[BytePos++] << 24) + (CompressData[BytePos++] << 16) + (CompressData[BytePos++] << 8) + CompressData[BytePos++]); } Tree = new HaffmanTree(MeetingBytes); // чтение байтов сжатого массива байтов Tree.DecodeBytes(CompressData, ref Data, ref BytePos, ref BitPos); StreamWriter Writer = new StreamWriter(DestFile); Writer.BaseStream.Write(Data, 0, Length); Writer.Close(); /* * byte[] SavedHash = new byte[16]; * Array.Copy(CompressData, BytePos, SavedHash, 0, 16); * if (MD5.Create().ComputeHash(Data).SequenceEqual(SavedHash)) * return true; * else * return false;*/ return(true); }
public float Compress(string SourceFile, string DestFile) { StreamReader Reader = new StreamReader(SourceFile); Data = new byte[Reader.BaseStream.Length]; Reader.BaseStream.Read(Data, 0, (int)Reader.BaseStream.Length); Reader.Close(); BuildFreqArray(); Tree = new HaffmanTree(MeetingBytes); int BytePos = 0; byte BitPos = 0; byte[] CompressData = new byte[Data.Length]; // длина исходного файла (в байтах) CompressData[BytePos++] = (byte)((Data.Length & 0xFF000000) >> 24); CompressData[BytePos++] = (byte)((Data.Length & 0x00FF0000) >> 16); CompressData[BytePos++] = (byte)((Data.Length & 0x0000FF00) >> 8); CompressData[BytePos++] = (byte)(Data.Length & 0x000000FF); // запись таблицы символов //Tree.WriteHeader(CompressData, ref BytePos, ref BitPos); CompressData[BytePos++] = (byte)(MeetingBytes.Length); for (int i = 0; i < MeetingBytes.Length; i++) { CompressData[BytePos++] = MeetingBytes[i].Byte; CompressData[BytePos++] = (byte)((MeetingBytes[i].Count & 0xFF000000) >> 24); CompressData[BytePos++] = (byte)((MeetingBytes[i].Count & 0x00FF0000) >> 16); CompressData[BytePos++] = (byte)((MeetingBytes[i].Count & 0x0000FF00) >> 8); CompressData[BytePos++] = (byte)(MeetingBytes[i].Count & 0x000000FF); } // запись сжатого массива байтов Tree.EncodeBytes(Data, ref CompressData, ref BytePos, ref BitPos); /* // запись хеш суммы исходного файла * byte[] OrigFileHash = MD5.Create().ComputeHash(Data); * for (int i = 0; i < OrigFileHash.Length; i++) * CompressData[BytePos++] = OrigFileHash[i];*/ StreamWriter Writer = new StreamWriter(DestFile); Writer.BaseStream.Write(CompressData, 0, BytePos); Writer.Close(); return((float)BytePos / Data.Length); }