Exemple #1
0
        private void decompress_Mode(byte[] buffer, byte mode, ushort windowSize)
        {
            CircularBuffer circularBuffer = new CircularBuffer(windowSize);
            string         outputPath     = FilePath + ".OUT";

            using (BinaryWriter writer = new BinaryWriter(new FileStream(outputPath, FileMode.Create)))
            {
                writer.Write(buffer, 0, 1);
                circularBuffer.AddData(new byte[] { buffer[0] });

                for (int i = 1; i < buffer.Length; i++)
                {
                    bool[] flags = GetFlags(buffer[i]);

                    for (int j = 7; j >= 0; j--)
                    {
                        if (flags[j])
                        {
                            byte[] wordBytes = new byte[2];
                            Array.Copy(buffer, ++i, wordBytes, 0, 2);
                            CompressedWord word   = new CompressedWord(wordBytes, mode);
                            byte[]         result = circularBuffer.GetData(word.Offset, word.Length);
                            i++;

                            writer.Write(result, 0, result.Length);
                        }
                        else
                        {
                            if (i < buffer.Length - 1)
                            {
                                writer.Write(buffer, ++i, 1);
                                circularBuffer.AddData(new byte[] { buffer[i] });
                            }
                        }
                        if (writer.BaseStream.Length >= LZSSHeader.UncompressedSize)
                        {
                            break;
                        }
                    }
                    if (writer.BaseStream.Length >= LZSSHeader.UncompressedSize)
                    {
                        break;
                    }
                }
            }
            DecompressedFile = HeaderList.GetTypeFromFile(outputPath);

            string headerPath = Path.Combine(Path.GetDirectoryName(FilePath), Path.GetFileName(FilePath) + ".HEADER");

            using (BinaryWriter writer = new BinaryWriter(new FileStream(headerPath, FileMode.Create)))
            {
                writer.Write(LZSSHeader.GetBytes());
            }
            HeaderFile = new BaseFile(headerPath);
        }