예제 #1
0
 public void FlushStoredBlock(byte *stored, int storedOffset, int storedLength, bool lastBlock)
 {
     pending.WriteBits((DeflaterConstants.StoredBlock << 1) + (lastBlock ? 1 : 0), 3);
     pending.AlignToByte();
     pending.WriteShort(storedLength);
     pending.WriteShort(~storedLength);
     pending.WriteBlock(stored, storedOffset, storedLength);
     Reset();
 }
예제 #2
0
        public unsafe int Deflate(byte[] output, int offset, int length)
        {
            int origLength = length;

            if (state == ClosedState)
            {
                throw new InvalidOperationException("Deflater closed");
            }
            if (state < BusyState)
            {
                int header     = (Deflated + ((DeflaterConstants.MaxWbits - 8) << 4)) << 8;
                int levelFlags = (level - 1) >> 1;
                if (levelFlags < 0 || levelFlags > 3)
                {
                    levelFlags = 3;
                }
                header |= levelFlags << 6;
                header += 31 - (header % 31);
                pending.WriteShortMsb(header);
                state = BusyState | (state & (IsFlushing | IsFinishing));
            }

            fixed(byte *mem = engine.memFix)
            {
                for (; ;)
                {
                    int count = pending.Flush(output, offset, length);
                    offset += count;
                    length -= count;
                    if (length == 0 || state == FinishedState)
                    {
                        break;
                    }
                    if (engine.Deflate((state & IsFlushing) != 0, (state & IsFinishing) != 0, mem))
                    {
                        continue;
                    }
                    switch (state)
                    {
                    case BusyState: return(origLength - length);

                    case FlushingState:
                    {
                        if (level != NoCompression)
                        {
                            int neededbits = 8 + ((-pending.BitCount) & 7);
                            while (neededbits > 0)
                            {
                                pending.WriteBits(2, 10);
                                neededbits -= 10;
                            }
                        }
                        state = BusyState;
                    } break;

                    case FinishingState:
                    {
                        pending.AlignToByte();
                        state = FinishedState;
                    } break;
                    }
                }
            }

            return(origLength - length);
        }