public string Compress_v_1_3(out List<CompressedFrame> compressedFrames, bool reducedLines = true)
{
var bytesFreqs = GetBytesFreqs(reducedLines, HuffmanRleRepeatedBits);
var tree = new HuffmanTree(bytesFreqs);
List<int> frameDiffs;
var framesChanges = CalculateFrameChanges();
compressedFrames = GetCompressedFrames(tree, reducedLines, framesChanges, out frameDiffs);
bytesFreqs = GetBytesFreqs(reducedLines, HuffmanRleRepeatedBits, compressedFrames);
tree = new HuffmanTree(bytesFreqs);
compressedFrames = GetCompressedFrames(tree, reducedLines, framesChanges, out frameDiffs);
var result = new byte[1000000];
int bitPos = 0;
Utils.AddInt(result, ref bitPos, bytesFreqs.Length, 8);
foreach (var byteCount in bytesFreqs)
{
Utils.AddInt(result, ref bitPos, byteCount.Byte, 8);
Utils.AddInt(result, ref bitPos, byteCount.Count, 24);
}
Utils.AddInt(result, ref bitPos, frameDiffs.Count, 24);
foreach (var diff in frameDiffs)
Utils.AddInt(result, ref bitPos, diff, 9);
foreach (var frame in compressedFrames)
Utils.AddBytes(result, ref bitPos, frame.CompressedBytes);
result = result.Take((bitPos + 7) / 8).ToArray();
return Convert.ToBase64String(result);
}