(С) Light Серпухов, 1996
И ЕЩЕ О КОМПРЕССИИ.
Данный компрессор относится к программам, использующим метод RLE, однако
он имеет некоторые отличия от них. Как Вы уже знаете, метод RLE основан на том,
что вместо повторяющегося несколько раз символа, сначала записывают код
символа, а затем число его повторов. Данный компрессор действует на несколько
другом принципе (хотя в основу положен тот же самый метод RLE).
Представим, что мы имеем следующую последовательность:
1,1,1,2,3,3,3 HEX
в двоичном представлении:
00000001,00000001,00000001,00000010,00000011,00000011,00000011
При сжатии информации используются следующие условия:
1. Первый байт записывается без изменения.
2. Если последующий байт равен предыдущему, то вместо него записывается бит = 0.
3. Если последующий байт не равен предыдущему, то вместо него записывается бит
= 1, a затем записывается значение самого байта.
Т.о приведенная выше последовательность запишется в виде:
третий
байт (1)
равен четвертый
предыд. байт (2) пятый
(бит=0) | байт (3)
| | |
- --------- ---------
00000001,00100000,01010000,001100 или 1,20,50,30
-------- - - - --
| | | | |
| | | | |
первый | четвертый | |
байт (1) | байт | шестой и
| не равен | седьмой
| предыд. | байты (3)
| (бит=1) пятйы равны
| байт (3) предыд.
второй не равен (биты=0)
байт (1) предыд.
равен (бит=1)
предыду-
щему
(бит=0)
T.е. мы получили 4 байта вместо 7. Следует обратить внимание на то, что
последний байт оказался незаполненным.
Сравним этот подход с классическим методом RLE.
Ъ---------------------В--------------В-----------------ї
і последовательность і классический і рассматриваемый і
і і метод і метод і
і і (байт) і (байт) і
Г---------------------Е--------------Е-----------------ґ
іQQQQQQQQQQQQQQQQQQQQ і 2 і 4 і
іAAAAAAAAAAQQQQQQQBBB і 6 і 6 і
іABBCCCDDDDEEEEEFFFFF і 12 і 9 і
іQAQAQAQAQAQAQAQAQAQA і 40 і 23 і
А---------------------Б--------------Б-----------------Щ
Анализируя эту таблицу, можно сделать выводы о границах применения данного
метода: он наиболее эффективен для компрессии повторяющихся чисел с малым
периодом повторения.
Для более полного понимания и испытания данного метода приводим программу
компрессии:
; (C) Light, Серпухов 1996
ORG 40000
ENT $
LD HL,0001
LD (INCR),HL ;Счетчик длины закомпрессированного блока.
LD A,%11111111
LD (BITE),A ;Контроль заполнения байта. Необходим, так как
;информация записывается побитно.
LD HL,50000
LD (BUFF),HL ;Адрес буфера для записи скомпрессированного
;блока.
LD HL,16384
LD DE,6912
PUSH DE
LD A,(HL) ;Читаем первый байт.
LD C,A ;Дублируем для сравнения с ним
;последующих байт, т.е. делаем его образцовым.
LD E,8 ;Записываем в буфер все 8 бит.
CALL MOVE ;переход к П/П записи числа побитно в буфер.
L5 INC HL ;Переходим к след. байту экрана.
POP DE
DEC DE
LD A,E
OR D
RET Z ;Если весь экран скомпрессирован, то выход.
;
PUSH DE
LD A,(HL)
CP C ;Последующий байт равен предыдущему ?
JR NZ,L3 ;Если не равен, то переход на L3.
LD E,1 ;Записываем в буфер 1 бит.
LD A,%00000000 ;Этот бит = 0.
CALL MOVE
JR L4
L3 LD E,1
LD A,%10000000 ;Записываем в буфер бит = 1.
LD E,8 ;Т.к. считанный байт не равен предыдущему, то
LD A,(HL) ;
LD C,A ;делаем его образцовым и
CALL MOVE ;записываем в буфер целиком.
L4 JR L5
;
MOVE PUSH HL ;Подпрограмма побитной записи чисел
L1 LD HL,BITE ;в буфер.
SLA (HL) ;Входные данные:
JR C,L2 ;Е - количество записываемых бит.
LD (HL),#FE ;А - записываемое число.
LD HL,(INCR) ;
INC HL ;Примечание: Первым записывается 7
LD (INCR),HL ;бит, последним 0 бит.
LD HL,BUFF
INC (HL)
JR NZ,L2
INC HL
INC (HL)
L2 LD HL,(BUFF)
SLA A
RL (HL)
DEC E
JR NZ,L1
POP HL
RET
;
BUFF DEFW #0000
BITE DEFB #00
INCR DEFW #0000
По окончании работы программы длину скомпрессированного блока можно взять
из ячейки INCR.