Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5098 | clevermous | 1 | В этом каталоге находится упрощенная переписанная на C мною, diamond'ом, версия |
2 | LZMA-упаковщика. Оригинальный LZMA SDK 4.32 является copyright (c) 1999-2005 |
||
3 | Igor Pavlov, может быть получен на странице http://www.7-zip.org/sdk.html, |
||
4 | содержит, в частности, версии исходного кода на C++,C# и Java для упаковки и |
||
5 | распаковки, код LZMA-распаковки на ANSI-C, описание формата 7z. |
||
6 | |||
7 | Эта версия не является безопасной в многопоточной среде, поддерживает только |
||
8 | bt4 match-finder, некоторые параметры упаковки зафиксированы (впрочем, это при |
||
9 | необходимости легко модифицировать), поддерживается только сжатие данных в |
||
10 | оперативной памяти. (Этих ограничений нет в оригинальном LZMA |
||
11 | SDK.) Эта версия не обязана компилироваться любым компилятором, ибо я использую |
||
12 | только VC++, хотя единственное известное мне отклонение от ANSI C состоит в |
||
13 | использовании VC-специфичной директивы #pragma intrinsic(memcpy), необходимой, |
||
14 | чтобы memcpy была встроена прямо в код - в результате библиотека не ссылается |
||
15 | ни на одну из функций C run-time library. (Мне это необходимо, поскольку |
||
16 | библиотека используется в ассемблерной программе MtApPack, не использующей |
||
17 | RTL и к тому же существующей и для Windows, и для Kolibri.) |
||
18 | |||
19 | Эта библиотека, как и оригинальный LZMA SDK, может быть использована в других |
||
20 | программах в соответствии с одной из лицензий (на ваш выбор) GNU LGPL или |
||
21 | GNU CPL. (Оригинальный SDK также допускает использование оригинальной |
||
22 | библиотеки без ограничений при условии использования объектных файлов без |
||
23 | модификации кода, на данную версию это не распространяется.) |
||
24 | |||
25 | Экспортируются две функции: в C++-стиле объявление выглядит так: |
||
26 | extern "C" __stdcall void lzma_set_dict_size(unsigned logdictsize); |
||
27 | extern "C" __stdcall unsigned lzma_compress( |
||
28 | const void* source, |
||
29 | void* destination, |
||
30 | unsigned length, |
||
31 | void* workmem); |
||
32 | |||
33 | Перед упаковкой требуется установить размер словаря первой из этих функций, |
||
34 | принимающей логарифм по основанию 2 этого значения |
||
35 | (т.е. dictsize == (1< |
||
36 | так что параметр logdictsize не должен превосходить 28. Если размер буфера |
||
37 | больше размера входных данных, то результат не зависит от размера буфера, |
||
38 | т.е. для данных размером 12345 байт результаты сжатия с буфером на 16384 байт и |
||
39 | на 1 мегабайт одинаковы. |
||
40 | Упаковка производится вызовом второй из этих функций. source - указатель на |
||
41 | входные данные, destination - указатель на буфер для упакованных данных, |
||
42 | length - длина входных данных, workmem - указатель на временную память, |
||
43 | используемую упаковщиком; должно быть выделено не менее 0x509000+dictsize*19/2 |
||
44 | байт. Для упакованных данных в худшем случае достаточно 0x10 + length*9/8 байт. |