ACNews #11
25 сентября 2002

Guide - Формат упакованного файла Hrust 2.1

<b>Guide</b> - Формат упакованного файла Hrust 2.1
     ▄▄▄▄ ▄  ▄ ▄▄▄ ▄▄▄  ▄▄▄▄
■▄░  ▓ ▄▄ ▓  ▓  ▓  ▓  ▒ ▓▄▄  ▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░ ■▄░
  ■▀ ░▄▄▓ ░▄▄░ ▄░▄ ░▄▄░ ░▄▄▄  ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀░ ■▀

              Формат упакованного файла Hrust 2.1:
              ────────────────────────────────────
                         -=заголовок=-

смещение  длина
  +0       3     "hr2" признак
  +3       1     "1"   зарезервировано.
                 если bit7=1, то файл был
                 просто     "сохранен".
                 (а значит - w[+4]=w[+6])

  +4       2     длина исходного файла
  +6       2     длина упакованного файла
  +8     w[+6]   упакованный файл.

   Перед упакованным блоком хранятся последние 6 байт файла,сами
эти 6 байт не пакуются.

   Байт по смещению +3 зарезервирован.В данной версии упаковщика
туда записывается "1",а депакер DEHR21 еще и учитывает bit7 это-
го  байта. Если  он включен, значит файл был просто сохранен без
сжатия.

                         -=тело файла=-

   В теле  файла хранятся сразу два потока - битовый и байтовый.
Байтовый содержит,что по названию понятно,целые байты,хранящиеся
с  целых  байтовых  адресов. Битовый поток помещается среди этих
байт; первый байт в упакованном блоке - непакованный первый байт
файла, следующий  байт  принадлежит битовому потоку, последующие
байты битового потока выбираются из указателя на байтовый поток,
после чего этот указатель увеличивается на единицу.
   Используется  метод  сжатия типа LZSS. Битовый поток является
управляющим и содержит коды, указывающие формат данных байтового
потока. Кодируются ссылки назад на повторы участков данных. Мак-
симальная длина повторяющегося фрагмента,кодируемого одной ссыл-
кой - 4095 байт (#fff).максимальная ссылка назад=-65535 байт (но
окно в самом упаковщике=16384 байта, причём уменьшается при при-
ближении  упакованного  куска  к непакованному - упаковка идет в
тот же буфер)

   итак:

(disp - это _отрицательное_ смещение в байтах между старым и но-
вым вхождением одной и той же последовательности. Цифрой обозна-
чим разрядность disp'а. "Число повторов" - длина этой последова-
тельности.)

011000nnnn - несколько  непакованных  байт, а  точнее, 12+nnnn*2
 байт (не более 42, как видно), в байтовом потоке - эти байты.
1 - просто  один  непакованный  байт (в  байтовом  потоке - этот
 байт).
000xxx - 1 повтор (xxx=disp3).
001 - 2 повтора (в байтовом потоке - disp8).
010... - 3 повтора.
01101... - 4 повтора.
01110... - 5 повторов.
0111100... - 6 повторов.
0111101... - 7 повторов.
   и т.д.
01111111110... - 14 повторов.

01111111111... - 15 повторов.
011001... - от  16  до  255  повторов (в байтовом потоке - число
 этих повторов)
011001... - от 256 до 4097 повторов (в байтовом потоке - сначала
 старший байт, потом младший байт  числа повторов. Очевидно, что
 старший  байт всегда меньше 16, что позволяет отличить последо-
 вательность от предыдущего случая).
011001 - это также конец файла,если байт в байтовом потоке равен
 нулю. Из этого,в частности,следует,что последний байт упакован-
 ного блока всегда равен нулю.

   Неиспользованные биты в последнем байте битового потока заби-
ваются  нулями, хотя  это  не имеет значения. Значение имеет тот
факт, что биты выбираются из этого потока слева направо (сначала
- 7-й бит байта, потом - 6-й и т.д.)

   Выше под многоточием понималось следующее указание disp'а:

1 - disp8 (#ff00-ffff) в байтовом потоке.
011x - disp9 (#fd00-feff), где x - старший  разряд (0 соответст-
 вует #fd), остальные 8 - в байтовом потоке.
010xx - disp10 (#f900-fcff), где xx - старшие  разряды (00 соот-
 ветствует #f9), остальные 8 - в байтовом потоке.
001xxx - disp11  (#f100-#f8ff), где  xxx - старшие  разряды (000
 соответствует #f1), остальные 8 - в байтовом потоке.
000xxxx - disp12  (#e300-#f0ff * ), где  xxxx - старшие  разряды
 (0010 соответствует #e3), остальные 8 - в байтовом потоке.
0000000 - disp16, хранится  в  байтовом потоке, сначала  старший
 байт, потом младший.
______
* Здесь  я  не  понял, почему смещение в пределах #e200-#e2ff не
кодируется 12-разрядным кодом (0000001). Будет хорошо, если поя-
вится hrumer и всё объяснит :)
------

   Добавление сразу во избежание путаницы: формат блока Hrust2.3
(Hrip) такой же, как в Hrust2.1, за исключением заголовка.

   Вся вышеизложенная информация получена с помощью изучения ко-
да программы Hrust 2.1.

   Жду дополнений и замечаний! если что неясно, попробую перефо-
рмулировать :)



Другие статьи номера:

Новости - местные новости.

Guide - Формат упакованного файла Hrust 2.1

Docs - новая версия монитора отладчика STS 5.3.

Fun - Мать вашу вообще, что же я хотел здесь написать? Кто сделал Lamergy?

Почётные и Вечные - Список Заслуженных Пользователей AC Edit.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
For Coderz - Построение графического пользовательского интерфейса.
Конкурс - Ваша задача, угадать название песни, а также исполнителя/группу.
Post... - Два наезда из разных городов.
HANGER - Исповедь палача.
cc'000 - GFX COMPO: Взгляд со стороны простого деревенского парня.

В этот день...   21 ноября