Реферат: Алгоритм сжатия "Unbuffered RLE"
Выходной_поток = Текущий_байт
Предыдущий_байт = Текущий_байт
Счетчик = 0
Конец если
Конец цикла
Как работает декодер
Здесь алгоритм еще проще. При декодировании бывший выходной поток является уже входным потоком, а получающийся выходной поток – это декодированная информация. Так вот, извлекая из входного потока байт, сразу же выбрасываем его в выходной поток. Далее сравниваем текущий байт с предыдущим байтом. Как только они одинаковы, извлекаем из входного потока байт, который является счетчиком повторов. Именно столько раз в выходной поток копируем текущий байт (что был перед счетчиком).
Предыдущий_байт = Взять_байт_из_входного_потока
Выходной_поток = Предыдущий_байт
Бесконечный цикл
Текущий_байт = Взять_байт_из_входного_потока
Выходной_поток = Текущий_байт
Если Текущий_байт = Предыдущий_байт тогда
Счетчик = Взять_байт_из_входного_потока
Цикл Счетчик раз Выходной_поток = Текущий_байт
Конец если
Предыдущий_байт = Текущий_байт
Конец цикла
И на всякий случай привожу ассемблерный код алгоритма декодирования. Код, естественно, рассчитан опять под аппаратное устройство, то есть дешевую плату с микропроцессором (нет памяти, используются три регистра, работа через порты ввода-вывода), которое находится на противоположной стороне транспортной магистрали и занимается банальным декодированием приходящего из транспортной магистрали потока. Тут входной порт микропроцессора подключен к транспортной магистрали, а выходной порт - к чему-нибудь еще, куда затем направляется раскодированный поток.
Decode_Unbuffred_RLE: // -----------------------
//
in al, Number_of_InputPort // AL = первый байт из входного потока
out Number_of_OutputPort, al // записать байт в выходной поток
mov ah, al // этот байт теперь становится предыдущим
//
Get_from_InputStream: // -----------------------
//
in al, Number_of_InputPort // AL = следующий байт из входного потока
out Number_of_OutputPort, al // записать байт в выходной поток
cmp al, ah // равен ли он предыдущему байту?