Пример #1
0
        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);
        }
Пример #2
0
        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);
        }