注意:压缩后的加密的压缩包如果不设置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");
精彩链接
发表评论