Zlib压缩和解压
1、压缩 — deinflate
Deinflate 流压缩
主要API
z_stream* zs = new z_stream(); //构造
deflateInit(zs,Z_DEFAULT_COMPRESSION); //初始化压缩方式
zs->avail_in = len; //输入长度
zs->next_in = buffIn; //输入地址
zs->avail_out = len; //输出长度
zs->next_out = buffOut; //输出地址
deflate(zs, Z_SYNC_FLUSH); //开始压缩
//avail_in 未处理的数据大小
int lastin = len - zs->avail_in;
//avail_out 未处理的数据大小
int lastout = len - zs->avail_out;
int main()
{
FILE* fp = fopen(R"(C:\Users\Administrator\Desktop\111.txt)", "rb+");
FILE* fpOut = fopen(R"(C:\Users\Administrator\Desktop\111334.zip)", "wb+");
fseek(fp, 0, SEEK_END);
int len = ftell(fp);
cout << len << endl;
fseek(fp, 0, SEEK_SET);
byte* buffIn = static_cast<byte*>(malloc(len));
byte* buffOut = static_cast<byte*>(malloc(len));
len = fread(buffIn, 1, len, fp);
cout << len << endl;
z_stream* zs = new z_stream();
deflateInit(zs,Z_DEFAULT_COMPRESSION);
zs->avail_in = len;
zs->next_in = buffIn;
zs->avail_out = len;
zs->next_out = buffOut;
deflate(zs, Z_SYNC_FLUSH);
int lastout = len - zs->avail_out;
fwrite(buffOut, 1, lastout, fpOut);
fflush(fpOut);
fclose(fp);
fclose(fpOut);
free(buffIn);
free(buffOut);
//_IO_sgetn()
return 0;
}
2、压缩 – compress2
主要API
uLong comprLen;
compress2(buffOut, &comprLen, buffIn, len, Z_BEST_SPEED);
int main()
{
FILE* fp = fopen(R"(C:\Users\Administrator\Desktop\111.txt)", "rb+");
FILE* fpOut = fopen(R"(C:\Users\Administrator\Desktop\1113347777.zip)", "wb+");
fseek(fp, 0, SEEK_END);
int len = ftell(fp);
cout << len << endl;
fseek(fp, 0, SEEK_SET);
byte* buffIn = static_cast<byte*>(malloc(len));
byte* buffOut = static_cast<byte*>(malloc(len));
len = fread(buffIn, 1, len, fp);
uLong comprLen;
compress2(buffOut, &comprLen, buffIn, len, Z_BEST_SPEED);
fwrite(buffOut, 1, comprLen, fpOut);
fflush(fpOut);
fclose(fp);
fclose(fpOut);
free(buffIn);
free(buffOut);
//_IO_sgetn()
return 0;
}
3、解压 – inflate
int main()
{
long OutputLen = 10485760;
FILE* fpOut = fopen(R"(C:\Users\Administrator\Desktop\111999.txt)", "wb+");
FILE* fpInput = fopen(R"(C:\Users\Administrator\Desktop\1113347777.zip)", "rb+");
fseek(fpInput, 0, SEEK_END);
int len = ftell(fpInput);
cout << len << endl;
fseek(fpInput, 0, SEEK_SET);
z_stream* pStream = new z_stream();
inflateInit(pStream);
byte* buffIn = static_cast<byte*>(malloc(len));
byte* buffOut = static_cast<byte*>(malloc(OutputLen));
len = fread(buffIn, 1, len, fpInput);
pStream->avail_in = len;
pStream->next_in = buffIn;
pStream->avail_out = OutputLen;
pStream->next_out = buffOut;
inflate(pStream, Z_FULL_FLUSH);
long lastIn = len - pStream->avail_in;
long lastOut = OutputLen - pStream->avail_out;
fwrite(buffOut, 1, lastOut, fpOut);
free(pStream);
fflush(fpOut);
fclose(fpInput);
fclose(fpOut);
free(buffIn);
free(buffOut);
//_IO_sgetn()
return 0;
}
4、解压 – uncompress
int main()
{
uLong OutputLen = 10485760;
FILE* fpOut = fopen(R"(C:\Users\Administrator\Desktop\111999547.txt)", "wb+");
FILE* fpInput = fopen(R"(C:\Users\Administrator\Desktop\1113347777.zip)", "rb+");
fseek(fpInput, 0, SEEK_END);
long len = ftell(fpInput);
cout << len << endl;
fseek(fpInput, 0, SEEK_SET);
byte* buffIn = static_cast<byte*>(malloc(len));
byte* buffOut = static_cast<byte*>(malloc(OutputLen));
len = fread(buffIn, 1, len, fpInput);
uLong len1 = len;
int result = uncompress2(buffOut, &OutputLen, buffIn, &len1);
cout << " =" << result << endl;
fwrite(buffOut, 1, OutputLen, fpOut);
fflush(fpOut);
fclose(fpInput);
fclose(fpOut);
free(buffIn);
free(buffOut);
//_IO_sgetn()
return 0;
}