提示:这里记录上一章提到的加密解密进行一个进阶的
打包+加密 —— + ——解包+解密
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
加密解密+打包解包- 文件打包加密和解包解密
- 思路
- 一、怎么加密?
- 二、使用步骤
- 1.加密打包
- 2.解密解包
- 笔记总结
思路
提示:这里分享一下思路记录的大概内容:
打包加密
- //创建打包文件
- //循环读取待打包文件
- //打包_将读取的数据存储到打包文件里
- //保存关闭
- //将打包好的文件进行加密
- //关闭保存
解包解密:
- //读取加密文件
- //将读取到的内容进行解密并写入各自对应的文件
- //进行解包
- //保存关闭
提示:以下是本篇文章正文内容,下面案例可供参考
一、怎么加密?用运算符,上一章讲到,或者用其他自定义算法都可以。
二、使用步骤 1.加密打包代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include #include //创建结构体存储打包关键信息 struct MyDbJm { char FileName[256]; int FileSize; }; int mlqz(double a); void quit(int n); int main(int argc, char* argv[]) { int key; printf("请输入加密密钥:"); scanf("%d", &key); int Num = argc - 1; srand((unsigned int)time(NULL)); //建立结构体数组 struct MyDbJm* FileIofos = (struct MyDbJm*)malloc(Num * sizeof(struct MyDbJm)); FILE* XxCc; printf("本次打包数量%d个n", argc - 1); printf("正在开始打包...n"); double jindu=NULL; //文件总大小 double JDbl = NULL;//一个初始值,最大等于文件大小 double Bai = NULL;//待定 //赋值 for (int i = 0; i < Num; i++) { strcpy(FileIofos[i].FileName, argv[i + 1]);//拷贝文件名 文件名赋值 XxCc = fopen(FileIofos[i].FileName, "rb");//读取拷贝这个文件 fseek(XxCc, 0, SEEK_END); //SEEK_SET 从文件头开始 SEEK_CUR 从当前位置 SEEK_END 从文件尾 FileIofos[i].FileSize = ftell(XxCc);//ftell获取文件内容指针到文件头的字节数 jindu += FileIofos[i].FileSize; fclose(XxCc);//关闭文件 } char buff[32] = { NULL }; sprintf(buff, "./%c%d%c%c%c%c_%d%c.520XC",//随机文件名 rand() % 26 + 'a', rand() % 10, rand() % 26 + 'A', rand() % 30 + 'a', rand() % 32 + 'a', rand() % 26 + 'a', rand() % 10, rand() % 38 + 'a'); FILE* XCdata = fopen(buff, "wb");//打包创建 //写入内容 // 1 文件个数 fwrite(&Num, 1, sizeof(int), XCdata); // 2 文件信息 fwrite(FileIofos, 1, Num * sizeof(struct MyDbJm), XCdata); // 3 文件内容 int r; char temp; JDbl = 0; for (int n = 0; n < Num; n++) { XxCc = fopen(FileIofos[n].FileName, "rb");//读取拷贝这个文件 while (1) { r = fread(&temp, 1, 1, XxCc);//向打包文件写入数据 if (1 == r) { fwrite(&temp, 1, 1, XCdata); JDbl++; } else break; } fclose(XxCc); printf("r已打包:%0.2f﹪",(JDbl/jindu)*100); } //关闭保存 fclose(XCdata); printf("n打包完成!n正在删除原文件...n"); for (int x = 0; x < Num; x++) { DeleteFile(argv[x + 1]); printf("r删除进度:%d﹪", mlqz((x / (Num-1))* 100)); Sleep(10); } Sleep(500); printf("n删除成功!n"); //文件加密 //1 创建加密文件 //char nuff[32]; //sprintf(nuff, "%s", buff); FILE* JM = fopen("./temp.tp", "wb");//创建加密文件 FILE* ltemp = fopen(buff, "rb");//读取加密文件 if (NULL == ltemp) { printf("文件打开失败!n"); return -1; } //2 进行加密 int r1; char temps; int ZJS = 0; while (1) { if (ZJS % 1024 == 0) { double test = (ZJS / jindu) * 100; if (test >= 100.00) { test = 100.00; }; printf("r正在进行加密:%0.2f﹪", test); } r1 = fread(&temps, 1, 1, ltemp); if (r1 >= 1) { temps ^= key; //加密 fwrite(&temps, 1, 1, JM);//加密后 ZJS += 1;//该文件的字节数 } else break; } //3 关闭文件 fclose(JM); fclose(ltemp); //4 删除原来的 Sleep(100); DeleteFile(buff); Sleep(100); MoveFile("temp.tp", buff); printf("n加密成功!n"); quit(6); system("pause"); return EXIT_SUCCESS; } //抹零取正 int mlqz(double a) { double b; b = a; if (b <= 0) { b= b*(-1); } return b; } void quit(int n) { printf("%d秒后自动退出...n", n); for (int v = n; v >= 0; v--) { printf("r倒计时:%d秒 ", v); Sleep(1000); } printf("n"); exit(-1); }
运行情况:
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS #include#include #include #include #include //创建结构体存储打包解包关键信息 struct MyDbJm { char FileName[256]; int FileSize; }; void JDt(int n); int main(int argc, char* argv[]) { int key; printf("请输入解密密钥:"); scanf("%d", &key); // 批量解密 printf("本次获取到了%d个文件待解压n",argc); double tg, kb, mb, gb, tb; tg =kb=mb=gb=tb= NULL;//统计大小 总大小 double dog[4080] = { NULL }; FILE* TG; for (int tgs = 1; tgs < argc;) { TG = fopen(argv[tgs], "rb"); if (NULL == TG) { printf("文件出错!或者文件可能已损坏!"); return -1; } int bv = 0; char map = NULL; fseek(TG, 0, SEEK_END); //SEEK_SET 从文件头开始 SEEK_CUR 从当前位置 SEEK_END 从文件尾 bv = ftell(TG); fseek(TG, 0, SEEK_SET); //SEEK_SET 从文件头开始 SEEK_CUR 从当前位置 SEEK_END 从文件尾 tg += bv; dog[tgs] = bv; int f; int cout = NULL; while (1) { f= fread(&map, 1, 1, TG); if (f > 0) { cout++; if (gb >= 1024) { gb = 0; tb += 1; } if (mb >= 1024) { mb = 0; gb += 1; } if (kb >= 1024) { kb = 0; mb += 1; } if (cout >= 1024) { cout = 0; kb += 1; } } else break; } double bfb = (tgs / (argc - 1))*100; if (bfb < 0) { bfb *= -1; } printf("r正在加载数据...[已加载:%0.2f KB]【%0.2f﹪】 ",(double)(tg/1024),bfb ); fclose(TG); tgs++; } { printf("n"); //printf("加载成功!加载文件总大小:%0.2f KB[%0.2f mb->%0.2f gb->%0.2f tb]",kb,mb,gb,tb ); if (kb > 0) { printf("加载成功!加载文件总大小:%0.2f KB", kb); } else if (mb > 0) { printf("加载成功!加载文件总大小:%0.2f MB", mb); } else if (gb > 0) { printf("加载成功!加载文件总大小:%0.2f GB", gb); } else if (tb > 0) { printf("加载成功!加载文件总大小:%0.2f TB", tb); } printf("n"); } for (int c = 1; c < argc;) { double DqJD = NULL, ZJD = NULL, Bai = NULL; //解密 //文件解密 printf("n正在准备解密第%d个文件...【预计大小】[%0.2f字节]n",c,dog[c]); //1 创建解密文件 FILE* JM = fopen("temp.tp", "wb");//创建解密文件 FILE* ltemp = fopen(argv[c], "rb");//读取加密文件 //2 进行加密 int rn; char tempn; int ZJS = 0; fseek(ltemp, 0, SEEK_END); //SEEK_SET 从文件头开始 SEEK_CUR 从当前位置 SEEK_END 从文件尾 ZJD = ftell(ltemp); fseek(ltemp, 0, SEEK_SET); printf("正在解密中...n文件名:%sn大小:%0.2f KB [%0.5f MB -> %0.9f GB]n", argv[c], (double)(ZJD / 1024),(double)(ZJD/(1024*1024)), (double)(ZJD / (1024 * 1024*1024))); while (1) { rn = fread(&tempn, 1, 1, ltemp); if (rn > 0) { tempn = tempn ^ key;//解密 fwrite(&tempn, 1, 1, JM);//解密后 ZJS += 1;//该文件的字节数 if (ZJS % 1024 == 0) { DqJD = (ZJS / ZJD) * 100; if (DqJD >= 100.00) { DqJD = 100.00; }if (DqJD <= 0) { DqJD *= -1; }; printf("r当前解密进度:%0.2f﹪", DqJD); } } else break; } //3 关闭文件 fclose(JM); fclose(ltemp); if (ZJS != ZJD) { printf("解密失败!"); return -1; } else { printf("n解密成功!n正在解包释放文件...n"); } //4 删除原来的 Sleep(100); DeleteFile(argv[c]); Sleep(100); MoveFile("temp.tp", argv[c]); int FileNum = NULL;//存储文件中读取的文件数量 //打开打包文件 FILE* JieBao = fopen(argv[c], "rb"); //读取文件个数 fread(&FileNum, 1, sizeof(int), JieBao); //建立结构体数组 struct MyDbJm* FileIofos = (struct MyDbJm*)malloc(FileNum * sizeof(struct MyDbJm)); //读取打包文件的信息 fread(FileIofos, 1, FileNum * sizeof(struct MyDbJm), JieBao); FILE* XxCc; int Mycont = NULL;//声明统计字节数变量 char temp = NULL; //赋值 for (int i = 0; i < FileNum; i++) { //1 创建解包文件 XxCc = fopen(FileIofos[i].FileName, "wb"); //2 循环 读取文件内容 Mycont = 0; while (1) { fread(&temp, 1, 1, JieBao); fwrite(&temp, 1, 1, XxCc); Mycont++; if (Mycont >= FileIofos[i].FileSize) break; } printf("r释放情况:%0.2f﹪【%d/%d】", (double)(((i + 1) / FileNum) * 100), i + 1, FileNum); Sleep(100); //3 关闭保存 fclose(XxCc); } fclose(JieBao); DeleteFile(argv[c]); printf("n解包成功!n"); c++; } for (int i = 5; i > 0; i--) { JDt(i); Sleep(1000); } printf("n"); exit(-1); system("pause"); return EXIT_SUCCESS; } void JDt(int n) { printf("r正在退出:-> "); for (int i = 0; i < n; i++) { printf("█"); } printf(" <- "); }
运行情况:
温馨提示:属性调节为多字节字符集
打包后情况预览:
属性调节:
笔记总结
提示:这里对文章进行总结:
回顾:
什么是文件 :
硬盘中存储 断电不流失
打开 关闭
读写
字符文件 字节文件:
文件的十二种打开方式 fputc fgetc fputs fgets printf scanf gets puts getchar putchar
文件内容指针:
光标
文件读写的时候,自动调整文件内容指针 如何手动挪文件内容指针 fseek offset 偏移量 正数 往后偏移 负数 往前偏移 origin 偏移起始位置 文件头 SEEK_SET 当前 SEEK_CUR 文件尾 SEEK_END feof:文件结束 返回 1 文件没结束 返回 0 ftell:获取文件内容指针到文件头的字节数 rewind:文件内容指针挪动到文件头
文件打包解包:
联合:
struct 结构名{
成员变量类型 成员变量名;
成员变量类型 成员变量名;
成员变量类型 成员变量名;
};
union 联合名{
成员变量类型 成员变量名;
成员变量类型 成员变量名;
成员变量类型 成员变量名;
};
联合的所有成员共用同一块内存。共同体 共用体
使用联合可以快速拆分
枚举:就是为了起名字
一次性定义多个名字
声明定义和结构体相同
但使用和结构体不同,直接使用枚举成员
C语言中没有bool类型:
1 true 0 false
添加头文件 stdbool.h
位段:
struct test{
int n : 1;
int m : 2;
};
为了灵活分配内存
````



