注意:压缩后的加密的压缩包如果不设置CRC是无法再window上解压的,会一直提示密码错误

const char* source_file = "D:/nim/nim/build/srcs/nim/waveData.csv";

const char* target_file = "D:/nim/nim/build/srcs/nim/waveData.zip";

const char* password = "123456";

下面是获取crc的代码

int getFileCrc(const char* filenameinzip, char* buf, unsigned long size_buf, unsigned long* result_crc)

{

unsigned long calculate_crc = 0;

int err = ZIP_OK;

FILE* fin;

fopen_s(&fin, filenameinzip, "rb");

unsigned long size_read = 0;

if (fin == NULL) {

err = ZIP_ERRNO;

}

if (err == ZIP_OK)

do {

err = ZIP_OK;

size_read = fread(buf, 1, size_buf, fin);

if (size_read < size_buf)

if (feof(fin) == 0) {

printf("error in reading %s\n", filenameinzip);

err = ZIP_ERRNO;

}

if (size_read > 0)

calculate_crc = crc32_z(calculate_crc, (const Bytef*)buf, size_read);

} while ((err == ZIP_OK) && (size_read > 0));

if (fin) {

fclose(fin);

}

*result_crc = calculate_crc;

printf("file %s crc %lx\n", filenameinzip, calculate_crc);

return err;

加密压缩代码

void compress_and_encrypt(const char* src, const char* dst, const char* pwd)

{

zipFile zfile = zipOpen(dst, APPEND_STATUS_CREATE);

if (zfile == NULL) {

printf("Error opening ZIP file for writing.\n");

return;

}

char buffer[4096];

zip_fileinfo zi;

memset(&zi, 0, sizeof(zi));

unsigned long crcFile;

getFileCrc(src, buffer, sizeof(buffer), &crcFile);

int err = zipOpenNewFileInZip3(zfile, "log.txt", &zi, NULL, 0, NULL, 0, NULL,

Z_DEFLATED, 4, 0, -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, pwd, crcFile);

if (err != ZIP_OK) {

printf("Error creating new file in ZIP: %d\n", err);

zipClose(zfile, NULL);

return;

}

//读

FILE* fin = fopen(src, "rb");

if (!fin) {

printf("Cannot open source file: %s\n", src);

zipClose(zfile, NULL);

return;

}

size_t read_bytes;

while ((read_bytes = fread(buffer, 1, sizeof(buffer), fin)) > 0) {

err = zipWriteInFileInZip(zfile, buffer, read_bytes);

if (err < 0) {

printf("Error writing to ZIP file: %d\n", err);

fclose(fin);

zipClose(zfile, NULL);

return;

}

}

fclose(fin);

err = zipCloseFileInZip(zfile);

if (err != ZIP_OK) {

printf("Error closing file in ZIP: %d\n", err);

}

err = zipClose(zfile, NULL);

if (err != ZIP_OK) {

printf("Error closing ZIP file: %d\n", err);

}

解压缩

void unzip_file(const char* zip_filename, const char* file_to_extract, const char* dest_path, const char* password)

{

unzFile uf = unzOpen(zip_filename);

if (uf == NULL) {

printf("无法打开ZIP文件\n");

return;

}

if (unzLocateFile(uf, file_to_extract, 1) != UNZ_OK) {

printf("在ZIP文件中找不到指定文件\n");

unzClose(uf);

return;

}

if (unzOpenCurrentFilePassword(uf, password) != UNZ_OK) {

printf("密码错误或文件未加密\n");

unzClose(uf);

return;

}

char write_buffer[4096];

FILE* fout = fopen(dest_path, "wb");

if (fout == NULL) {

printf("无法打开目标文件以写入\n");

unzCloseCurrentFile(uf);

unzClose(uf);

return;

}

int ret;

do {

ret = unzReadCurrentFile(uf, write_buffer, 4096); // 读取压缩数据

if (ret < 0) {

printf("读取文件出错\n");

break;

} else if (ret > 0) {

fwrite(write_buffer, ret, 1, fout); // 写入解压后的数据

}

} while (ret > 0);

fclose(fout);

unzCloseCurrentFile(uf); // 关闭当前文件

unzClose(uf); // 关闭ZIP文件

if (ret < 0) {

remove(dest_path); // 如果解压过程中出现错误,删除部分解压的文件

printf("解压文件时发生错误\n");

} else {

printf("成功解压文件到%s\n", dest_path);

}

mian

compress_and_encrypt(source_file, target_file, password);

unzip_file(target_file, "log.txt", "log.txt", "123456");

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。