4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK 4.65
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK provides the documentation, samples, header files, libraries,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncand tools you need to develop applications that use LZMA compression.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLICENSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK is written and placed in the public domain by Igor Pavlov.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK Contents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-----------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA SDK includes:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUNIX/Linux version
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTo compile C++ version of file->file LZMA encoding, go to directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncC++/7zip/Compress/LZMA_Alone
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncand call make to recompile it:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync make -f makefile.gcc clean all
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIn some UNIX/Linux versions you must compile LZMA with static libraries.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTo compile with static libraries, you can use
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLIB = -lm -static
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFiles
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSource code structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync---------------------
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaLib - LZMA Library (.DLL for Windows)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaUtil - LZMA Utility (file->file LZMA encoder/decoder).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Archive - files related to archiving
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7z - 7z ANSI-C Decoder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCPP/ -- CPP files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Common - common files for C++ projects
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Windows - common files for Windows related code
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7zip - files related to 7-Zip Project
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Common - common files for 7-Zip
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compress - files related to compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Archive - files related to archiving
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Common - common files for archive handling
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7z - 7z C++ Encoder/Decoder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bundles - Modules that are bundles of other modules
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UI - User Interface files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Common - Common UI files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Console - Code for console archiver
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCS/ - C# files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7zip
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 LZMA - LZMA compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaAlone - file->file LZMA compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RangeCoder - Range Coder (special code of compression/decompression)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncJava/ - Java files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SevenZip
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Compression - files related to compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZ - files related to LZ (Lempel-Ziv) compression algorithm
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LZMA - LZMA compression/decompression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RangeCoder - Range Coder (special code of compression/decompression)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://sourceforge.net/projects/sevenzip/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA decoder uses only integer operations and can be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncimplemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHow To Use
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync----------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsing LZMA encoder/decoder executable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUsage: LZMA <e|d> inputFile outputFile [<switches>...]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync e: encode file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync d: decode file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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 LZMA b 30
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Default number of iterations is 10.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync<Switches>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -a{N}: set compression mode 0 = fast, 1 = normal
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default: 1 (normal)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -lc{N}: set number of literal context bits - [0, 8], default: 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Sometimes lc=4 gives gain for big files.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Memory requirements depend from dictionary size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (parameter "d" in table below).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MF_ID Memory Description
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -si: Read data from stdin (it will write End Of Stream marker).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -so: Write data to stdout
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExamples:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync1) LZMA e file.bin file.lzma -d16 -lc0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync2) LZMA e file.bin file.lzma -lc0 -lp2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccompresses file.bin to file.lzma with settings suitable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfor 32-bit periodical data (for example, ARM or MIPS code).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync3) LZMA d file.lzma file.bin
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdecompresses file.lzma to file.bin.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompression ratio hints
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-----------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRecommendations
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync---------------
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,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdata, ...).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFilters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-------
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou can find C source code of such filters in C/Bra*.* files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou can check the compression ratio gain of these filters with such
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync7-Zip commands (example for ARM code):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNo filter:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7z a a1.7z a.bin -m0=lzma
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWith filter for little-endian ARM code:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 7z a a2.7z a.bin -m0=arm -m1=lzma
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIt works in such manner:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompressing = Filter_encoding + LZMA_encoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDecompressing = LZMA_decoding + Filter_decoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThese filters convert CALL (calling procedure) instructions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom relative offsets to absolute addresses, so such data becomes more
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynccompressible.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFor some ISAs (for example, for MIPS) it's impossible to get gain from such filter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncANSI-C LZMA Decoder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync~~~~~~~~~~~~~~~~~~~
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncfrom sourceforge.net site.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTo use ANSI-C LZMA Decoder you need the following files:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync1) LzmaDec.h + LzmaDec.c + Types.h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLzmaUtil/LzmaUtil.c is example application that uses these files.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMemory requirements for LZMA decoding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncStack usage of LZMA decoding function for local variables is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynclarger than 200-400 bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHow To decompress data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync----------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA Decoder (ANSI-C version) now supports 2 interfaces:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync1) Single-call Decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync2) Multi-call State Decompressing (zlib-like interface)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou must use external allocator:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExample:
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 };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncYou can use p = p; operator to disable compiler warnings.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSingle-call Decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync-------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWhen to use: RAM->RAM decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompile files: LzmaDec.h + LzmaDec.c + Types.h
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInterface:
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 In:
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Out:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync destLen - processed output size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync srcLen - processed input size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Output:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_OK
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync status:
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
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
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. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMulti-call State Decompressing (zlib-like interface)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync----------------------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWhen to use: file->file decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompile files: LzmaDec.h + LzmaDec.c + Types.h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaDec_Init(&state);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (;;)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync4) Free all allocated structures
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaDec_Free(&state, &g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFor full code example, look at C/LzmaUtil/LzmaUtil.c code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncHow To compress data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCompile files: LzmaEnc.h + LzmaEnc.c + Types.h +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLzFind.c + LzFind.h + LzFindMt.c + LzFindMt.h + LzHash.h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMemory Requirements:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - (dictSize * 11.5 + 6 MB) + state_size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLzma Encoder can use two memory allocators:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync1) alloc - for small arrays.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync2) allocBig - for big arrays.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSingle-call Compression with callbacks
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--------------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCheck C/LzmaUtil/LzmaUtil.c as example,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWhen to use: file->file decompressing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync1) you must implement callback structures for interfaces:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncISeqInStream
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncISeqOutStream
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncICompressProgress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncISzAlloc
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CFileSeqInStream inStream;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CFileSeqOutStream outStream;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inStream.funcTable.Read = MyRead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync inStream.file = inFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outStream.funcTable.Write = MyWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync outStream.file = outFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync2) Create CLzmaEncHandle object;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CLzmaEncHandle enc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync enc = LzmaEnc_Create(&g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (enc == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SZ_ERROR_MEM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync3) initialize CLzmaEncProps properties;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaEncProps_Init(&props);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Then you can change some properties in that structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync4) Send LZMA properties to LZMA Encoder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = LzmaEnc_SetProps(enc, &props);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync5) Write encoded properties to header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Byte header[LZMA_PROPS_SIZE + 8];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size_t headerSize = LZMA_PROPS_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UInt64 fileSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync6) Call encoding function:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL, &g_Alloc, &g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync7) Destroy LZMA Encoder Object
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIf callback function return some error code, LzmaEnc_Encode also returns that code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSingle-call RAM->RAM Compression
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync--------------------------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSingle-call RAM->RAM Compression is similar to Compression with callbacks,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbut you provide pointers to buffers instead of pointers to stream callbacks:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncReturn code:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SZ_OK - OK
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)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLZMA Defines
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync------------
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_LZMA_UINT32_IS_ULONG - Define it if int is 16-bit on your compiler and long is 32-bit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_LZMA_NO_SYSTEM_SIZE_T - Define it if you don't want to use size_t type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncC++ LZMA Encoder/Decoder
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncC++ Notes
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{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *p = ::malloc(size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (p == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync throw CNewException();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return p;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync---
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://www.7-zip.org
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://www.7-zip.org/sdk.html
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://www.7-zip.org/support.html