Копирую сюда Формат архива LZA.txt от @gid
Код:
проги:
LZ.SAV - упаковщик LZS
UZ.SAV - распаковщик LZS
прога с правками от EmeSoft:
LZA.SAV - упаковщик LZA
UZA.SAV - распаковщик LZA
Правки:
1. для упаковщика уменьшен буфер в 2 раза, соответственно памяти требуется сильно меньше.
2. сжатые данные инвертированы, но КС считается по неинвертированным данным
3. изменён текст, сделаны незначительные оптимизации.
формат Архива:
struct ArchHeader { // заголовок архива
word archID = EmeSoft ? ^R<LZA> : ^R<LZS>; // сигнатура
word version = "21"; // версия архива
word N; // размер кольцевого буфера в байтах 010000 или 04000 для EmeSoft
word date; // дата создания архива
word password; // зашифрованный пароль для распаковки, 0, если нету.
/* пароль шифруется так:
password = comb(swab(^R<nnn> xor archID)),
где nnn - открытый пароль, заданный в ключе /P */
word 0; // зарезервировано
word archCatSize; // размер каталога архива в байтах, 0 - если нет каталога
word archCatBlk; // номер блока начала каталога, относительно начала файла архива,
// 0 - если нет каталога
// каталог архива выравнивается по границе блока.
};
struct FileHeader { // заголовок файла
dword .rad50 "FILNAM"; // имя файла в RADIX-50
word .rad50 "EXT" // расширение файла в RADIX-50
word unpSizeBlk; // размер файла в блоках до архивации
word date; // дата создания файла
word CS; // контрольная сумма упакованного массива
dword pckSize; // размер упакованного массива в байтах
}
struct ArchCatRecord { // запись о файле в каталоге архива
word blkNum; // номер блока относительно начала файла архива, с которого начинается файл в архиве
word offset; // смещение в блоке, с которого начинается массив упакованных данных файла
FileHeader file; // структура заголовка файла
}
// формат Архива
Archive {
ArchHeader header; // заголовок архива
{
FileHeader fh; // заголовок файла
byte[fh.pckSize]; // упакованный массив
.wordeven // выравнивание по слову
} по количеству файлов в архиве;
.blockeven // выравнивание по блоку
// каталог архива, опционально
{
ArchCatRecord fileRecord; // запись о файле в каталоге архива
} по количеству файлов в архиве;
};