这个 还希望如果有高玩的话,帮忙看一下,不知道为什么实现不了非文本文件的加解密。
我觉得问题就在下面标红加下划线的地方。分别在 code.c 跟 decode.c里面。
main.c
#include#include #pragma warning(disable:4996)#include "code.h"#include "decode.h"void workflow(const int argc, const char **argv);void judgeCodeOrDecode(const int argc, const char **argv);/** 二进制文件加解密,模仿之前那个高级的版本做一个,这次要求不同的代码块要分开。 最后一个参数是一个八进制的码。这个密码强度感觉比之前那个数字的要牛。但是不知道是否经得起检验试试看吧。如果一个几十Mb的东西没问题,估计就没问题了。*/int main(int argc,char **argv){ workflow(argc,argv); return 0;}void workflow(const int argc, const char **argv){ if (argc < 5){ printf("参数过少,需要5个参数\n"); } else if (argc>5){ printf("参数过多,需要5个参数\n"); } else { //justCopy(); judgeCodeOrDecode(argc,argv); }}void judgeCodeOrDecode(const int argc, const char **argv){ if (strcmp(argv[3], "code") == 0){ codeFile(argv); } else if (strcmp(argv[3], "decode") == 0){ decodeFile(argv); } else{ printf("请输入 code 或者 decode,来进行 编码 或者 解码 操作。"); }}
code.h
#ifndef _CODEH#define _CODEHvoid coding(char *, const int, const char *key);void codeFile(const char **argv);#endif
code.c
#include#include #pragma warning(disable:4996)/** 实质上就是 一个文件写入操作。*/void coding(char *,const int,const char *key);void codeFile(const char **argv);/** argv[0]是exe名字. argv[1]是 文件的第一个名字。 argv[2] 是文件的第二个名字。 argv[3] 选择是否编解码 argv[4] 秘钥 这个地方有点儿问题 先不做那么麻烦的。先弄成10进制数字吧。 所以 这里code需要345.*/void codeFile(const char **argv){ FILE *src = fopen(argv[1], "rb"); if (src==NULL){ printf("加密失败,源文件未找到\n"); } FILE *dest = fopen(argv[2], "wb"); char buf[1024 * 4] = { 0 }; while (!feof(src)){ size_t size = fread(buf, 1, sizeof(buf), src); coding(buf,size,argv[4]); fwrite(buf, 1, size, dest); }}void coding(char *str,const int len,const char *key){ int i = 0; int mykey = atoi(key); //printf(mykey); //getchar(); for (; i < len; i++){ str[i] += mykey; }}
decode.h
#ifndef _DECODEH#define _DECODEHvoid decoding(char *, const int, const char *key);void decodeFile(const char **argv);#endif
decode.c
#include#include #include #pragma warning(disable:4996)/**实质上就是 一个文件写入操作。*/void decoding(char *, const int, const char *key);void decodeFile(const char **argv);/**argv[0]是exe名字.argv[1]是 文件的第一个名字。argv[2] 是文件的第二个名字。argv[3] 选择是否编解码argv[4] 秘钥 这个地方有点儿问题 先不做那么麻烦的。先弄成10进制数字吧。所以 这里code需要345.*/void decodeFile(const char **argv){ FILE *src = fopen(argv[1], "rb"); if (src == NULL){ printf("解密失败,源文件未找到\n"); } FILE *dest = fopen(argv[2], "wb"); char buf[1024 * 4] = { 0 }; while (!feof(src)){ size_t size = fread(buf, 1, sizeof(buf), src); decoding(buf, size, argv[4]); fwrite(buf, 1, size, dest); }}void decoding(char *str, const int len, const char *key){ int i = 0; int mykey = atoi(key); //printf(mykey); //getchar(); for (; i < len; i++){ str[i] -= mykey; }}