liblzma代码示例
时间: 2023-07-09 16:34:13 浏览: 75
以下是一个使用liblzma库进行数据压缩和解压缩的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lzma.h>
#define BUFFER_SIZE 1024
int compress_file(char *input_filename, char *output_filename)
{
FILE *input_file = fopen(input_filename, "rb");
if (input_file == NULL) {
fprintf(stderr, "Error opening input file %s\n", input_filename);
return 1;
}
FILE *output_file = fopen(output_filename, "wb");
if (output_file == NULL) {
fprintf(stderr, "Error opening output file %s\n", output_filename);
return 1;
}
lzma_stream strm = LZMA_STREAM_INIT;
lzma_ret ret = lzma_easy_encoder(&strm, 6, LZMA_CHECK_CRC64);
if (ret != LZMA_OK) {
fprintf(stderr, "Error initializing encoder: %s\n", lzma_strerror(ret));
return 1;
}
uint8_t in_buf[BUFFER_SIZE];
uint8_t out_buf[BUFFER_SIZE];
size_t in_size = 0, out_size = 0;
strm.next_out = out_buf;
strm.avail_out = BUFFER_SIZE;
do {
in_size = fread(in_buf, 1, BUFFER_SIZE, input_file);
if (ferror(input_file)) {
fprintf(stderr, "Error reading from input file\n");
return 1;
}
strm.next_in = in_buf;
strm.avail_in = in_size;
do {
ret = lzma_code(&strm, LZMA_RUN);
if (ret != LZMA_OK && ret != LZMA_STREAM_END) {
fprintf(stderr, "Error compressing data: %s\n", lzma_strerror(ret));
return 1;
}
out_size = BUFFER_SIZE - strm.avail_out;
if (out_size > 0) {
if (fwrite(out_buf, 1, out_size, output_file) != out_size) {
fprintf(stderr, "Error writing compressed data to output file\n");
return 1;
}
}
strm.next_out = out_buf;
strm.avail_out = BUFFER_SIZE;
} while (strm.avail_in > 0);
} while (ret != LZMA_STREAM_END);
ret = lzma_code(&strm, LZMA_FINISH);
if (ret != LZMA_OK && ret != LZMA_STREAM_END) {
fprintf(stderr, "Error finishing compression: %s\n", lzma_strerror(ret));
return 1;
}
out_size = BUFFER_SIZE - strm.avail_out;
if (out_size > 0) {
if (fwrite(out_buf, 1, out_size, output_file) != out_size) {
fprintf(stderr, "Error writing compressed data to output file\n");
return 1;
}
}
lzma_end(&strm);
fclose(input_file);
fclose(output_file);
return 0;
}
int decompress_file(char *input_filename, char *output_filename)
{
FILE *input_file = fopen(input_filename, "rb");
if (input_file == NULL) {
fprintf(stderr, "Error opening input file %s\n", input_filename);
return 1;
}
FILE *output_file = fopen(output_filename, "wb");
if (output_file == NULL) {
fprintf(stderr, "Error opening output file %s\n", output_filename);
return 1;
}
lzma_stream strm = LZMA_STREAM_INIT;
lzma_ret ret = lzma_stream_decoder(&strm, UINT64_MAX, 0);
if (ret != LZMA_OK) {
fprintf(stderr, "Error initializing decoder: %s\n", lzma_strerror(ret));
return 1;
}
uint8_t in_buf[BUFFER_SIZE];
uint8_t out_buf[BUFFER_SIZE];
size_t in_size = 0, out_size = 0;
strm.next_out = out_buf;
strm.avail_out = BUFFER_SIZE;
do {
in_size = fread(in_buf, 1, BUFFER_SIZE, input_file);
if (ferror(input_file)) {
fprintf(stderr, "Error reading from input file\n");
return 1;
}
strm.next_in = in_buf;
strm.avail_in = in_size;
do {
ret = lzma_code(&strm, LZMA_RUN);
if (ret != LZMA_OK && ret != LZMA_STREAM_END) {
fprintf(stderr, "Error decompressing data: %s\n", lzma_strerror(ret));
return 1;
}
out_size = BUFFER_SIZE - strm.avail_out;
if (out_size > 0) {
if (fwrite(out_buf, 1, out_size, output_file) != out_size) {
fprintf(stderr, "Error writing decompressed data to output file\n");
return 1;
}
}
strm.next_out = out_buf;
strm.avail_out = BUFFER_SIZE;
} while (strm.avail_in > 0);
} while (ret != LZMA_STREAM_END);
lzma_end(&strm);
fclose(input_file);
fclose(output_file);
return 0;
}
int main(int argc, char *argv[])
{
if (argc != 4) {
fprintf(stderr, "Usage: %s <compress|decompress> <input_filename> <output_filename>\n", argv[0]);
return 1;
}
if (strcmp(argv[1], "compress") == 0) {
return compress_file(argv[2], argv[3]);
} else if (strcmp(argv[1], "decompress") == 0) {
return decompress_file(argv[2], argv[3]);
} else {
fprintf(stderr, "Invalid command %s\n", argv[1]);
return 1;
}
}
```
这个示例代码可以通过命令行参数指定要压缩或解压缩的文件,以及压缩或解压缩后的文件。在压缩时,它使用lzma_easy_encoder函数初始化压缩器,然后使用lzma_code函数进行数据压缩。在解压缩时,它使用lzma_stream_decoder函数初始化解压器,然后使用lzma_code函数进行数据解压缩。