Esempio n. 1
0
        byte[] DecompressLZS()
        {
            while (!IsFinished)
            {
                bool isCompressed = Input.BooleanMSB();
                if (isCompressed)                      // Compressed bytes follow.
                {
                    int offsetCode = Input.ReadMSB(1); // 0 for 11 bits offset, 1 for 7 bits offset and possible end marker.
                    int offset     = Input.ReadMSB(offsetCode == 1 ? 7 : 11);

                    if (offset == 0)
                    {
                        // Zero offset is an end marker for the 7-bit offset length.
                        if (offsetCode == 1)
                        {
                            break;
                        }
                        throw new InvalidDataException("Zero offset.");
                    }

                    int count = ReadLZSRunLength();
                    if (count == 0)
                    {
                        throw new InvalidDataException("Length mismatch.");
                    }

                    WriteMemory(offset, count);
                }
                else                    // Literal byte follows
                {
                    byte literal = (byte)Input.ReadMSB(8);
                    Write(literal);
                }
            }

            CheckEnd();
            return(OutputData);
        }