public void Unpack() { while (true) { var read = _data.Read(); if (read == -1) { return; } var ch = (char)read; if (ch == '<') { var offset = ReadInteger(); var len = ReadInteger(); _unpacker.EncodeSubstring(offset, len); continue; } _unpacker.EncodeLiteral((byte)ch); } }
public void Unpack(InputBitStream intputBitStream, SubstringUnpacker unpacker) { var offsetReaders = offsets.Select(x => x.Read(intputBitStream).GetEnumerator()).ToArray(); bool hasEof = false; foreach (var symbol in symbols.Read(intputBitStream)) { if (symbol == EofMarker) { hasEof = true; break; } if (symbol < 256) { unpacker.EncodeLiteral((byte)symbol); continue; } int len = symbol - 256; int offset = 0; for (int i = 0; i < offsetReaders.Length; i++) { var moveNext = offsetReaders[i].MoveNext(); if (moveNext == false) { throw new InvalidDataException("Expected offset, but got end of stream"); } offset |= offsetReaders[i].Current << (i * 4); } offset = -offset; unpacker.EncodeSubstring(offset, len); } if (hasEof == false) { throw new InvalidDataException("End of stream before EOF marker"); } }