4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK 4.65
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK provides the documentation, samples, header files, libraries,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncand tools you need to develop applications that use LZMA compression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA is default and general compression method of 7z format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncin 7-Zip compression program (www.7-zip.org). LZMA provides high
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccompression ratio and very fast decompression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA is an improved version of famous LZ77 compression algorithm.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIt was improved in way of maximum increasing of compression ratio,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynckeeping high decompression speed and low memory requirements for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdecompressing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK is written and placed in the public domain by Igor Pavlov.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK Contents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-----------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK includes:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - ANSI-C/C++/C#/Java source code for LZMA compressing and decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Compiled file->file LZMA compressing/decompressing program for Windows system
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTo compile C++ version of file->file LZMA encoding, go to directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncand call make to recompile it:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync make -f makefile.gcc clean all
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIn some UNIX/Linux versions you must compile LZMA with static libraries.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTo compile with static libraries, you can use
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLIB = -lm -static
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync---------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynclzma.txt - LZMA SDK description (this file)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync7zFormat.txt - 7z Format description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync7zC.txt - 7z ANSI-C Decoder description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncmethods.txt - Compression method IDs for .7z
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynclzma.exe - Compiled file->file LZMA encoder/decoder for Windows
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchistory.txt - history of the LZMA SDK
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSource code structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync---------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncC/ - C files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7zCrc*.* - CRC code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Alloc.* - Memory allocation functions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bra*.* - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzFind.* - Match finder for LZ (LZMA) encoders
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzFindMt.* - Match finder for LZ (LZMA) encoders for multithreading encoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzHash.h - Additional file for LZ match finder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaDec.* - LZMA decoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaEnc.* - LZMA encoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaLib.* - LZMA Library for DLL calling
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Types.h - Basic types for another .c files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Threads.* - The code for multithreading.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaLib - LZMA Library (.DLL for Windows)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaUtil - LZMA Utility (file->file LZMA encoder/decoder).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Archive - files related to archiving
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7z - 7z ANSI-C Decoder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCPP/ -- CPP files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Common - common files for C++ projects
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Windows - common files for Windows related code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7zip - files related to 7-Zip Project
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Common - common files for 7-Zip
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compress - files related to compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copy - Copy coder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RangeCoder - Range Coder (special code of compression/decompression)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZMA - LZMA compression/decompression on C++
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZMA_Alone - file->file LZMA compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Branch - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Archive - files related to archiving
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Common - common files for archive handling
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bundles - Modules that are bundles of other modules
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Alone7z - 7zr.exe: Standalone version of 7z.exe that supports only 7z/LZMA/BCJ/BCJ2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Format7zR - 7zr.dll: Reduced version of 7za.dll: extracting/compressing to 7z/LZMA/BCJ/BCJ2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Format7zExtractR - 7zxr.dll: Reduced version of 7zxa.dll: extracting from 7z/LZMA/BCJ/BCJ2.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI - User Interface files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Common - Common UI files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Console - Code for console archiver
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCS/ - C# files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Common - some common files for 7-Zip
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compress - files related to compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZ - files related to LZ (Lempel-Ziv) compression algorithm
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaAlone - file->file LZMA compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RangeCoder - Range Coder (special code of compression/decompression)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncJava/ - Java files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compression - files related to compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZ - files related to LZ (Lempel-Ziv) compression algorithm
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RangeCoder - Range Coder (special code of compression/decompression)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncC/C++ source code of LZMA SDK is part of 7-Zip project.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync7-Zip source code can be downloaded from 7-Zip's SourceForge page:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA features
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Variable dictionary size (up to 1 GB)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Estimated compressing speed: about 2 MB/s on 2 GHz CPU
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Estimated decompressing speed:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - 20-30 MB/s on 2 GHz Core 2 or AMD Athlon 64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - 1-2 MB/s on 200 MHz ARM, MIPS, PowerPC or other simple RISC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Small memory requirements for decompressing (16 KB + DictionarySize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Small code size for decompressing: 5-8 KB
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA decoder uses only integer operations and can be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimplemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSome critical operations that affect the speed of LZMA decompression:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1) 32*16 bit integer multiply
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2) Misspredicted branches (penalty mostly depends from pipeline length)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 3) 32-bit shift and arithmetic operations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThe speed of LZMA decompressing mostly depends from CPU speed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMemory speed has no big meaning. But if your CPU has small data cache,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncoverall weight of memory speed will slightly increase.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsing LZMA encoder/decoder executable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsage: LZMA <e|d> inputFile outputFile [<switches>...]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e: encode file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync d: decode file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync b: Benchmark. There are two tests: compressing and decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with LZMA method. Benchmark shows rating in MIPS (million
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instructions per second). Rating value is calculated from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync measured speed and it is normalized with Intel's Core 2 results.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Also Benchmark checks possible hardware errors (RAM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync errors in most cases). Benchmark uses these settings:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (-a1, -d21, -fb32, -mfbt4). You can change only -d parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Also you can change the number of iterations. Example for 30 iterations:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Default number of iterations is 10.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -a{N}: set compression mode 0 = fast, 1 = normal
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default: 1 (normal)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync d{N}: Sets Dictionary size - [0, 30], default: 23 (8MB)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The maximum value for dictionary size is 1 GB = 2^30 bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dictionary size is calculated as DictionarySize = 2^N bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync For decompressing file compressed by LZMA method with dictionary
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size D = 2^N you need about D bytes of memory (RAM).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -fb{N}: set number of fast bytes - [5, 273], default: 128
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Usually big number gives a little bit better compression ratio
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and slower compression process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -lc{N}: set number of literal context bits - [0, 8], default: 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Sometimes lc=4 gives gain for big files.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -lp{N}: set number of literal pos bits - [0, 4], default: 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lp switch is intended for periodical data when period is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync equal 2^N. For example, for 32-bit (4 bytes)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync periodical data you can use lp=2. Often it's better to set lc0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if you change lp switch.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -pb{N}: set number of pos bits - [0, 4], default: 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pb switch is intended for periodical data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync when period is equal 2^N.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -mf{MF_ID}: set Match Finder. Default: bt4.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Algorithms from hc* group doesn't provide good compression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ratio, but they often works pretty fast in combination with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fast mode (-a0).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Memory requirements depend from dictionary size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (parameter "d" in table below).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MF_ID Memory Description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bt2 d * 9.5 + 4MB Binary Tree with 2 bytes hashing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bt3 d * 11.5 + 4MB Binary Tree with 3 bytes hashing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bt4 d * 11.5 + 4MB Binary Tree with 4 bytes hashing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync hc4 d * 7.5 + 4MB Hash Chain with 4 bytes hashing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -eos: write End Of Stream marker. By default LZMA doesn't write
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync eos marker, since LZMA decoder knows uncompressed size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stored in .lzma file header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -si: Read data from stdin (it will write End Of Stream marker).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -so: Write data to stdout
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccompresses file.bin to file.lzma with 64 KB dictionary (2^16=64K)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncand 0 literal context bits. -lc0 allows to reduce memory requirements
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfor decompression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccompresses file.bin to file.lzma with settings suitable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfor 32-bit periodical data (for example, ARM or MIPS code).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompression ratio hints
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-----------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRecommendations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync---------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTo increase the compression ratio for LZMA compressing it's desirable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncto have aligned data (if it's possible) and also it's desirable to locate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdata in such order, where code is grouped in one place and data is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncgrouped in other place (it's better than such mixing: code, data, code,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou can increase the compression ratio for some data types, using
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncspecial filters before compressing. For example, it's possible to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncincrease the compression ratio on 5-10% for code for those CPU ISAs:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncx86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou can find C source code of such filters in C/Bra*.* files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou can check the compression ratio gain of these filters with such
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync7-Zip commands (example for ARM code):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7z a a1.7z a.bin -m0=lzma
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWith filter for little-endian ARM code:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7z a a2.7z a.bin -m0=arm -m1=lzma
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIt works in such manner:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompressing = Filter_encoding + LZMA_encoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDecompressing = LZMA_decoding + Filter_decoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompressing and decompressing speed of such filters is very high,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncso it will not increase decompressing time too much.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMoreover, it reduces decompression time for LZMA_decoding,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsince compression ratio with filtering is higher.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThese filters convert CALL (calling procedure) instructions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom relative offsets to absolute addresses, so such data becomes more
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccompressible.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFor some ISAs (for example, for MIPS) it's impossible to get gain from such filter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA compressed file format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync---------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncOffset Size Description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0 1 Special LZMA properties (lc,lp, pb in encoded form)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1 4 Dictionary size (little endian)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 5 8 Uncompressed size (little endian). -1 means unknown size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 13 Compressed data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncANSI-C LZMA Decoder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync~~~~~~~~~~~~~~~~~~~
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPlease note that interfaces for ANSI-C code were changed in LZMA SDK 4.58.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIf you want to use old interfaces you can download previous version of LZMA SDK
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTo use ANSI-C LZMA Decoder you need the following files:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLzmaUtil/LzmaUtil.c is example application that uses these files.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMemory requirements for LZMA decoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncStack usage of LZMA decoding function for local variables is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynclarger than 200-400 bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA Decoder uses dictionary buffer and internal state structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternal state structure consumes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync state_size = (4 + (1.5 << (lc + lp))) KB
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncby default (lc=3, lp=0), state_size = 16 KB.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHow To decompress data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync----------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA Decoder (ANSI-C version) now supports 2 interfaces:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync1) Single-call Decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync2) Multi-call State Decompressing (zlib-like interface)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou must use external allocator:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid *SzAlloc(void *p, size_t size) { p = p; return malloc(size); }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid SzFree(void *p, void *address) { p = p; free(address); }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncISzAlloc alloc = { SzAlloc, SzFree };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou can use p = p; operator to disable compiler warnings.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSingle-call Decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWhen to use: RAM->RAM decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompile defines: no defines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMemory Requirements:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Input buffer: compressed size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Output buffer: uncompressed size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - LZMA Internal Structures: state_size (16 KB for default settings)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ELzmaStatus *status, ISzAlloc *alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync dest - output data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destLen - output data size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync src - input data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync srcLen - input data size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync propData - LZMA properties (5 bytes)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync propSize - size of propData buffer (5 bytes)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync finishMode - It has meaning only if the decoding reaches output limit (*destLen).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZMA_FINISH_ANY - Decode just destLen bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZMA_FINISH_END - Stream must be finished after (*destLen).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync You can use LZMA_FINISH_END, when you know that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync current output buffer covers last bytes of stream.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync alloc - Memory allocator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destLen - processed output size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync srcLen - processed input size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZMA_STATUS_FINISHED_WITH_MARK
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZMA_STATUS_NOT_FINISHED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_ERROR_DATA - Data error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_ERROR_MEM - Memory allocation error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_ERROR_UNSUPPORTED - Unsupported properties
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If LZMA decoder sees end_marker before reaching output limit, it returns OK result,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and output value of destLen will be less than output buffer size limit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync You can use multiple checks to test data integrity after full decompression:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1) Check Result and "status" variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync You must use correct finish mode in that case. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMulti-call State Decompressing (zlib-like interface)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync----------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWhen to use: file->file decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMemory Requirements:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Buffer for input stream: any size (for example, 16 KB)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Buffer for output stream: any size (for example, 16 KB)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - LZMA Internal Structures: state_size (16 KB for default settings)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - LZMA dictionary (dictionary size is encoded in LZMA properties header)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unsigned char header[LZMA_PROPS_SIZE + 8];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReadFile(inFile, header, sizeof(header)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CLzmaDec state;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaDec_Constr(&state);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (res != SZ_OK)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return res;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaDec_Init(&state);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync4) Free all allocated structures
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaDec_Free(&state, &g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFor full code example, look at C/LzmaUtil/LzmaUtil.c code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHow To compress data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLzFind.c + LzFind.h + LzFindMt.c + LzFindMt.h + LzHash.h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMemory Requirements:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - (dictSize * 11.5 + 6 MB) + state_size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLzma Encoder can use two memory allocators:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync1) alloc - for small arrays.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync2) allocBig - for big arrays.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFor example, you can use Large RAM Pages (2 MB) in allocBig allocator for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbetter compression speed. Note that Windows has bad implementation for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLarge RAM Pages.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIt's OK to use same allocator for alloc and allocBig.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSingle-call Compression with callbacks
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCheck C/LzmaUtil/LzmaUtil.c as example,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWhen to use: file->file decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync1) you must implement callback structures for interfaces:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncISeqInStream
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncISeqOutStream
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncICompressProgress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void SzFree(void *p, void *address) { p = p; MyFree(address); }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic ISzAlloc g_Alloc = { SzAlloc, SzFree };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CFileSeqInStream inStream;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CFileSeqOutStream outStream;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync2) Create CLzmaEncHandle object;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CLzmaEncHandle enc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync enc = LzmaEnc_Create(&g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (enc == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SZ_ERROR_MEM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync3) initialize CLzmaEncProps properties;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaEncProps_Init(&props);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Then you can change some properties in that structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync4) Send LZMA properties to LZMA Encoder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = LzmaEnc_SetProps(enc, &props);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync5) Write encoded properties to header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Byte header[LZMA_PROPS_SIZE + 8];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t headerSize = LZMA_PROPS_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UInt64 fileSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = LzmaEnc_WriteProperties(enc, header, &headerSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fileSize = MyGetFileLength(inFile);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i = 0; i < 8; i++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync header[headerSize++] = (Byte)(fileSize >> (8 * i));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MyWriteFileAndCheck(outFile, header, headerSize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync6) Call encoding function:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL, &g_Alloc, &g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync7) Destroy LZMA Encoder Object
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIf callback function return some error code, LzmaEnc_Encode also returns that code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSingle-call RAM->RAM Compression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSingle-call RAM->RAM Compression is similar to Compression with callbacks,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbut you provide pointers to buffers instead of pointers to stream callbacks:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturn code:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_ERROR_MEM - Memory allocation error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_ERROR_PARAM - Incorrect paramater
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_ERROR_OUTPUT_EOF - output buffer overflow
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_ERROR_THREAD - errors in multithreading functions (only for Mt version)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA Defines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_LZMA_PROB32 - It can increase the speed on some 32-bit CPUs, but memory usage for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync some structures will be doubled in that case.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler and long is 32-bit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_LZMA_NO_SYSTEM_SIZE_T - Define it if you don't want to use size_t type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync~~~~~~~~~~~~~~~~~~~~~~~~
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncC++ LZMA code use COM-like interfaces. So if you want to use it,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncyou can study basics of COM/OLE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncC++ LZMA code is just wrapper over ANSI-C code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync~~~~~~~~~~~~~~~~~~~~~~~~
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIf you use some C++ code folders in 7-Zip (for example, C++ code for .7z handling),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncyou must check that you correctly work with "new" operator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync7-Zip can be compiled with MSVC 6.0 that doesn't throw "exception" from "new" operator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSo 7-Zip uses "CPP\Common\NewHandler.cpp" that redefines "new" operator:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncoperator new(size_t size)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *p = ::malloc(size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (p == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync throw CNewException();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIf you use MSCV that throws exception for "new" operator, you can compile without
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync"NewHandler.cpp". So standard exception will be used. Actually some code of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync7-Zip catches any exception in internal code and converts it to HRESULT code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSo you don't need to catch CNewException, if you call COM interfaces of 7-Zip.