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(); }
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); }