Алгоритм сжатия RLE


Алгоритмы RLE - это сокращенная запись повторяющихся символов
Такие алгоритмы применяются, к примеру, в форматах BMP, PCX
Кое-как они подходят для изображений, но для текста и видео - нет.

== Запись RLE - потока ==

[1] Выбрать любой байт-код в качестве признака повторения
[2] Взять следующий байт с входного потока
[3] Взятый байт = признаку повторения?
[4]    ДА: Вывести в выходной поток два одинаковых байта
[5]    НЕТ: Взятый байт есть в буфере?
[6]        ДА: Поместить байт в буфер, перейти к [2]
[7]        НЕТ: В буфере 1 байт?
[8]           ДА: Вывести буфер на выход. В буфер поместить новый байт
[9]           НЕТ: Вывети признак повторения. Вывести
[10]               Вывести 1 байт из буфера
[11]               Вывести кол-во повторений
[12]               В буфер поместить новый 1 байт
[13] Если есть еще байты на входе, перейти к [2]
[14] Если байтов нет - сбросить буфер на выход по аналогии с [7]-[11]


== Чтение RLE - потока ==

[1] Взять байт со входа, есть есть байт на входе
[2] Байт не равен признаку повторения?
[3]     ДА: Вывести байт на выход
[4]         Перейти к [1]
[5]     НЕТ: Следующий байт равен признаку повторения?
[6]        ДА: Вывести на выход 1 признак повторения
[7]            Перейти к [1]
[8]        НЕТ: Взять следующий байт - "что повторять" - А
[9]             Взять следующий байт - "сколько раз повторять" - Б
[10]            Вывести на выход байт А в количестве раз Б
[11] Перейти к [1]ывести байт на выход
[4]         Перейти к [1]
[5]     НЕТ: Следующий байт равен признаку повторения?
[6]        ДА: Вывести на выход 1 признак повторения
[7]            Перейти к [1]
[8]        НЕТ: Взять следующий байт - "что повторять" - А
[9]             Взять следующий байт - "сколько раз повторять" - Б
[10]            Вывести на выход байт А в количестве раз Б
[11] Перейти к [1]