main.c
#include <fcntl.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <zlib.h> #define MAX_BUF (32 * 1024 * 1024) char zip[MAX_BUF] = {0}; char file[MAX_BUF] = {0}; char unzip[MAX_BUF] = {0}; int zip_compress(uint8_t *src, int slen, uint8_t *dst, int dlen) { int err = -1; int ret = -1; z_stream stream = {0}; stream.total_in = stream.avail_in = slen; stream.total_out = stream.avail_out = dlen; stream.next_in = src; stream.next_out = dst; err = deflateInit(&stream, Z_DEFAULT_COMPRESSION); if (err == Z_OK) { err = deflate(&stream, Z_FINISH); if (err == Z_STREAM_END) { ret = stream.total_out; } } deflateEnd(&stream); return ret; } int zip_decompress(uint8_t *src, int slen, uint8_t *dst, int dlen) { int err = -1; int ret = -1; z_stream stream = {0}; stream.total_in = stream.avail_in = slen; stream.total_out = stream.avail_out = dlen; stream.next_in = src; stream.next_out = dst; err = inflateInit(&stream); if (err == Z_OK) { err = inflate(&stream, Z_FINISH); if (err == Z_STREAM_END) { ret = stream.total_out; } } inflateEnd(&stream); return ret; } int main(int argc, char **argv) { int r = 0; int fd = -1; fd = open("test.bin", O_RDONLY); r = read(fd, file, sizeof(file)); close(fd); printf("file length: %d\n", r); r = zip_compress(file, r, zip, sizeof(zip)); fd = open("test.zip", O_CREAT | O_WRONLY); write(fd, zip, r); close(fd); printf("zip length: %d\n", r); r = zip_decompress(zip, r, unzip, sizeof(unzip)); fd = open("test.unzip", O_CREAT | O_WRONLY); write(fd, unzip, r); close(fd); printf("unzip length: %d\n", r); return 0; }
編譯、執行
$ gcc main.c -o main -lz $ echo "123" > test.bin $ ./main file length: 4 zip length: 12 unzip length: 4 $ cat test.unzip 123