private static ReadBuffer UnpackVLE(ReadBuffer packedData) { var widthsCount = packedData[0]; var widths = packedData.Slice(1, widthsCount); var alphabetCount = widths.Select(val => (int)val).Sum(); var alphabet = packedData.Slice(1 + widthsCount, alphabetCount); var dictionary = new HuffmanTree(widths, alphabet); var stream = EnumerateBits(packedData.Drop(1 + widthsCount + alphabetCount)); var result = new WriteBuffer(); while (true) { int value = dictionary.DecodeByte(stream); if (value < 0) { break; } result.Append((byte)value); } return(result.ToReadBuffer()); }