Expand menu
7z ANSI-C Decoder 4.62


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.



7z ANSI-C Decoder is part of the LZMA SDK.

LZMA SDK is written and placed in the public domain by Igor Pavlov.



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 must download 7-Zip program from www.7-zip.org.

You can create .7z archive with 7z.exe or 7za.exe:

  7za.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  


  e: Extract files from archive

  l: List contents of archive

  t: Test integrity of archive


  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:



      UInt32 i;

      for (i = 0; i < db.db.NumFiles; i++)


        CFileItem *f = db.db.Files + i;

        printf("%10d  %s\n", (int)f->Size, f->Name);



  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:




  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":


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.



_SZ_ALLOC_DEBUG   - define it if you want to debug alloc/free operations to stderr.