Source code
Revision control
Copy as Markdown
Other Tools
7z ANSI-C Decoder 9.35↩
----------------------↩
↩
7z ANSI-C provides 7z/LZMA decoding.↩
7z ANSI-C version is simplified version ported from C++ code.↩
↩
LZMA is default and general compression method of 7z format↩
in 7-Zip compression program (www.7-zip.org). LZMA provides high ↩
compression ratio and very fast decompression.↩
↩
↩
LICENSE↩
-------↩
↩
7z ANSI-C Decoder is part of the LZMA SDK.↩
LZMA SDK is written and placed in the public domain by Igor Pavlov.↩
↩
Files↩
---------------------↩
↩
7zDecode.* - Low level 7z decoding↩
7zExtract.* - High level 7z decoding↩
7zHeader.* - .7z format constants↩
7zIn.* - .7z archive opening↩
7zItem.* - .7z structures↩
7zMain.c - Test application↩
↩
↩
How To Use↩
----------↩
↩
You can create .7z archive with 7z.exe, 7za.exe or 7zr.exe:↩
↩
7z.exe a archive.7z *.htm -r -mx -m0fb=255↩
↩
If you have big number of files in archive, and you need fast extracting, ↩
you can use partly-solid archives:↩
↩
7za.exe a archive.7z *.htm -ms=512K -r -mx -m0fb=255 -m0d=512K↩
↩
In that example 7-Zip will use 512KB solid blocks. So it needs to decompress only ↩
512KB for extracting one file from such archive.↩
↩
↩
Limitations of current version of 7z ANSI-C Decoder↩
---------------------------------------------------↩
↩
- It reads only "FileName", "Size", "LastWriteTime" and "CRC" information for each file in archive.↩
- It supports only LZMA and Copy (no compression) methods with BCJ or BCJ2 filters.↩
- It converts original UTF-16 Unicode file names to UTF-8 Unicode file names.↩
↩
These limitations will be fixed in future versions.↩
↩
↩
Using 7z ANSI-C Decoder Test application:↩
-----------------------------------------↩
↩
Usage: 7zDec <command> <archive_name>↩
↩
<Command>:↩
e: Extract files from archive↩
l: List contents of archive↩
t: Test integrity of archive↩
↩
Example: ↩
↩
7zDec l archive.7z↩
↩
lists contents of archive.7z↩
↩
7zDec e archive.7z↩
↩
extracts files from archive.7z to current folder.↩
↩
↩
How to use .7z Decoder↩
----------------------↩
↩
Memory allocation↩
~~~~~~~~~~~~~~~~~↩
↩
7z Decoder uses two memory pools:↩
1) Temporary pool↩
2) Main pool↩
Such scheme can allow you to avoid fragmentation of allocated blocks.↩
↩
↩
Steps for using 7z decoder↩
--------------------------↩
↩
Use code at 7zMain.c as example.↩
↩
1) Declare variables:↩
inStream /* implements ILookInStream interface */↩
CSzArEx db; /* 7z archive database structure */↩
ISzAlloc allocImp; /* memory functions for main pool */↩
ISzAlloc allocTempImp; /* memory functions for temporary pool */↩
↩
2) call CrcGenerateTable(); function to initialize CRC structures.↩
↩
3) call SzArEx_Init(&db); function to initialize db structures.↩
↩
4) call SzArEx_Open(&db, inStream, &allocMain, &allocTemp) to open archive↩
↩
This function opens archive "inStream" and reads headers to "db".↩
All items in "db" will be allocated with "allocMain" functions.↩
SzArEx_Open function allocates and frees temporary structures by "allocTemp" functions.↩
↩
5) List items or Extract items↩
↩
Listing code:↩
~~~~~~~~~~~~~↩
↩
Use SzArEx_GetFileNameUtf16 function. Look example code in C\Util\7z\7zMain.c file. ↩
↩
↩
Extracting code:↩
~~~~~~~~~~~~~~~~↩
↩
SZ_RESULT SzAr_Extract(↩
CArchiveDatabaseEx *db,↩
ILookInStream *inStream, ↩
UInt32 fileIndex, /* index of file */↩
UInt32 *blockIndex, /* index of solid block */↩
Byte **outBuffer, /* pointer to pointer to output buffer (allocated with allocMain) */↩
size_t *outBufferSize, /* buffer size for output buffer */↩
size_t *offset, /* offset of stream for required file in *outBuffer */↩
size_t *outSizeProcessed, /* size of file in *outBuffer */↩
ISzAlloc *allocMain,↩
ISzAlloc *allocTemp);↩
↩
If you need to decompress more than one file, you can send these values from previous call:↩
blockIndex, ↩
outBuffer, ↩
outBufferSize,↩
You can consider "outBuffer" as cache of solid block. If your archive is solid, ↩
it will increase decompression speed.↩
↩
After decompressing you must free "outBuffer":↩
allocImp.Free(outBuffer);↩
↩
6) call SzArEx_Free(&db, allocImp.Free) to free allocated items in "db".↩
↩
↩
↩
↩
Memory requirements for .7z decoding ↩
------------------------------------↩
↩
Memory usage for Archive opening:↩
- Temporary pool:↩
- Memory for uncompressed .7z headers↩
- some other temporary blocks↩
- Main pool:↩
- Memory for database: ↩
Estimated size of one file structures in solid archive:↩
- Size (4 or 8 Bytes)↩
- CRC32 (4 bytes)↩
- LastWriteTime (8 bytes)↩
- Some file information (4 bytes)↩
- File Name (variable length) + pointer + allocation structures↩
↩
Memory usage for archive Decompressing:↩
- Temporary pool:↩
- Memory for LZMA decompressing structures↩
- Main pool:↩
- Memory for decompressed solid block↩
- Memory for temprorary buffers, if BCJ2 fileter is used. Usually these ↩
temprorary buffers can be about 15% of solid block size. ↩
↩
↩
7z Decoder doesn't allocate memory for compressed blocks. ↩
Instead of this, you must allocate buffer with desired ↩
size before calling 7z Decoder. Use 7zMain.c as example.↩
↩
↩
Defines↩
-------↩
↩
_SZ_ALLOC_DEBUG - define it if you want to debug alloc/free operations to stderr.↩
↩
↩
---↩
↩