Я, честно говоря, не уверен, что побудило бы кого-либо использовать текстовую RLE, если он хочет сжать с ней двоичные данные. BMP - это не текст.
Прямо сейчас, поскольку после $
читается только один байт, и это интерпретируется как число ascii от 0 до 9, этот процесс имеет диапазон длин серий от 0 до 9, что означает, что вы можете только сжать значения до до 9 повторений до того, как нужно будет написать новый флаг длины пробега. В конце концов, вы не можете сделать разницу между $I34
для длины прогона 34 и $I3
+ 4
для литерала 4
за повторением 3.
Если этот же байт вместо этого интерпретируется как двоичное значение, он может содержать значения от 0 до 255 , что дает массивную разницу в эффективности.
Что касается экранирования $
самих знаков, я бы посоветовал либо всегда рассматривать его как повторение по крайней мере 1 ($$1
), либо, что еще лучше, кодировать все это по-другому, с порядком значения длины выполнения и данные меняются местами, поэтому код становится $<length><data>
; тогда вы можете использовать $0
в качестве специального символа, означающего «просто $
». Когда вы распаковываете и сталкиваетесь с 0 после $
, просто не читайте третий байт. Длина прогона, равная 0, никогда не должна появляться в сжатых данных в любом случае, поэтому ей можно придать особое значение, но это бесполезно, если байт данных ставится первым, поскольку тогда он все равно будет такой же длины, что и обычный повтор.