miniz — fast single-file ZIP implementation in C
I have an unhealthy obsession with one-file implementations of useful things in C, which you can just drop into your project and use without configuring libraries with dozens of files. Miniz is one such project: it is a single 225 KB
miniz.c, which contains a
zlibreplacement plus functions to read/write ZIP files.
miniz performanceBut that's not all: miniz has a very fast level 1 (BEST_SPEED) compression implementation, which is much faster than zlib:
Fills a single threaded performance vs. compression ratio gap between several popular real-time compressors and zlib. For example, at level 1, miniz.c compresses around 5-9% better than minilzo, but is approx. 35% slower. At levels 2-9, miniz.c is designed to compare favorably against zlib's ratio and speed.There are benchmarks that compare miniz with other compression libraries.
Using minizThere's only one file —
miniz.c. There is no corresponding
.h, you just it as a header file:
miniz.c acts like a header file via magic ifdefs. Then you can use either simple functions like
uncompressfor in-memory compression and decompression:
or use zlib-compatibility functions:
// Returns Z_OK on success, or one of the error codes from deflate() on failure. int compress(Byte *pDest, uLong *pDest_len, const Byte *pSource, uLong source_len); // Like compress() but with more control, level may range from 0 (storing) to 9 (max. compression) int compress2(Byte *pDest, uLong *pDest_len, const Byte *pSource, uLong source_len, int level); // Returns Z_OK on success, or one of the error codes from inflate() on failure. int uncompress(Byte *pDest, uLong *pDest_len, const Byte *pSource, uLong source_len);
You can also deal with ZIP files. For example, to extract a file from a ZIP archive to memory:
deflateInit, deflateInit2, deflateReset, deflate, deflateEnd, deflateBound inflateInit, inflateInit2, inflate, inflateEnd
Check out examples in the repository, which show how to use miniz.
// Returns pointer to extracted file, or NULL on failure. void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags);