private void ReadLengths(HuffmanTree preTree, uint[] lengths, int offset, int count) { int i = 0; while (i < count) { uint value = preTree.NextSymbol(_bitStream); if (value == 17) { uint numZeros = 4 + _bitStream.Read(4); for (uint j = 0; j < numZeros; ++j) { lengths[offset + i] = 0; ++i; } } else if (value == 18) { uint numZeros = 20 + _bitStream.Read(5); for (uint j = 0; j < numZeros; ++j) { lengths[offset + i] = 0; ++i; } } else if (value == 19) { uint same = _bitStream.Read(1); value = preTree.NextSymbol(_bitStream); if (value > 16) { throw new InvalidDataException("Invalid table encoding"); } uint symbol = (17 + lengths[offset + i] - value) % 17; for (uint j = 0; j < 4 + same; ++j) { lengths[offset + i] = symbol; ++i; } } else { lengths[offset + i] = (17 + lengths[offset + i] - value) % 17; ++i; } } }