private static void DecodeInternal(Stream source, Stream destination, ref long decompressedBytes) { UInt8_NE_H_InputBitStream bitStream = new UInt8_NE_H_InputBitStream(source); for (; ;) { if (bitStream.Pop()) { NeutralEndian.Write1(destination, NeutralEndian.Read1(source)); ++decompressedBytes; } else { long count = 0; long offset = 0; if (bitStream.Pop()) { byte high = NeutralEndian.Read1(source); byte low = NeutralEndian.Read1(source); count = high & 0x07; if (count == 0) { count = NeutralEndian.Read1(source); if (count == 0) { break; } count += 9; } else { count = 10 - count; } offset = ~0x1FFFL | ((0xF8 & high) << 5) | low; } else { offset = NeutralEndian.Read1(source); offset |= ~0xFFL; byte low = Convert.ToByte(bitStream.Pop()); byte high = Convert.ToByte(bitStream.Pop()); count = (low << 1 | high) + 2; } for (long i = 0; i < count; i++) { long writePosition = destination.Position; destination.Seek(writePosition + offset, SeekOrigin.Begin); byte b = NeutralEndian.Read1(destination); destination.Seek(writePosition, SeekOrigin.Begin); NeutralEndian.Write1(destination, b); } decompressedBytes += count; } } }
public override bool Push(bool bit) { this.byteBuffer |= (byte)(Convert.ToByte(bit) << this.waitingBits); if (++this.waitingBits >= 8) { NeutralEndian.Write1(this.stream, this.byteBuffer); this.waitingBits = 0; this.byteBuffer = 0; return(true); } return(false); }
public override bool Flush(bool unchanged) { if (this.waitingBits != 0) { if (!unchanged) { this.byteBuffer <<= 8 - this.waitingBits; } NeutralEndian.Write1(this.stream, this.byteBuffer); this.waitingBits = 0; return(true); } return(false); }
public override bool Write(byte data, int size) { if (this.waitingBits + size >= 8) { int delta = 8 - this.waitingBits; this.waitingBits = (this.waitingBits + size) % 8; byte bits = (byte)((this.byteBuffer << delta) | (data >> this.waitingBits)); NeutralEndian.Write1(this.stream, bits); this.byteBuffer = data; return(true); } this.byteBuffer <<= size; this.byteBuffer |= data; this.waitingBits += size; return(false); }