为什么我的输出包含额外的字符?为什么只有每个文件的第一行通过notepad ++加密而不是整个文件? 快乐的编码! P.S我有Kernighan和Ritchie的第二版C编程语言
编辑:这个代码是我修改后的代码,问题已经得到解答了。谢谢你们!
这是我的源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define getchar() getc(stdin)
#define putchar() putc((c),stdout)
#define XOR_BYTE 0x9E
char * xorBuffer(char *buffer, long bufferSize){
int i;
for(i = 0;i <= bufferSize;i++){
buffer[i] ^= XOR_BYTE;
}
return buffer;
}
int xorFile(char *fileIn, char * fileOut){
FILE *fpi, *fpo;
char *fileBuffer = NULL;
fpi = fopen(fileIn,"rb");
fpo = fopen(fileOut,"wb");
if(NULL == fpi){
printf("Error opening input file %s: %s\n", fileIn, strerror(errno));
return 1;
}
if(NULL == fpo){
printf("Error opening output file %s: %s\n", fileOut, strerror(errno));
return 2;
}
fseek(fpi,0L,SEEK_END);
long fileSize = ftell(fpi);
fileBuffer = malloc(sizeof(char)* (fileSize + 1));
fseek(fpi,0L,SEEK_SET);
size_t length = fread(fileBuffer, sizeof(char), fileSize,fpi);
fileBuffer[length];
fileBuffer = (char *)xorBuffer(fileBuffer,fileSize);
int c;
for(c = 0;c < fileSize;c++){
putc(((fileBuffer[c])),fpo);
}
fclose(fpi);
fclose(fpo);
free(fileBuffer);
return 0;
}
int main(int argc, char*argv[]){
if(argc == 3){
if(xorFile(argv[1],argv[2]) == 0)
printf("File encryption was successful.");
else
printf("An error occured.");
}else{
printf("usage --- xor [input file][output file]");
}
}
答案 0 :(得分:0)
你正在将字符串传递给一个需要FILE *参数的函数。这告诉我编译器正在向你抱怨大时间并且你忽略了它
此外,您没有测试fopen函数的任何返回值。
然后修复那两件事然后重新发布
答案 1 :(得分:0)
XOR_FILE
的原型不正确:你应该拿2个字符串。
您的代码中存在更多问题:
fseek
和ftell
可靠地获取文件大小,一般情况下不需要它,您可以实现具有固定大小缓冲区的缓冲版本。for (i = 0; i < newLen; i++)
否则你会在加密时输出一个额外的字节在破译时... '\0'
中重复XOR_BUFFER(char *FILE_BUFFER)
,传递大小并使用它。否则,您将无法加密包含空字节的二进制文件。fpo
fclose(fpo);
getchar()
和putchar()
。这是一个简化版本:
#include <stdio.h>
#include <string.h>
#include <errno.h>
#define XOR_BYTE 0x9E
int xor_file(const char *infile, const char *outfile) {
FILE *fpi, *fpo;
int c;
if ((fpi = fopen(infile, "rb")) == NULL) {
fprintf("cannot open input file %s: %s\n", infile, strerror(errno));
return 1;
}
if ((fpo = fopen(outfile, "wb")) == NULL)
fprintf("cannot open output file %s: %s\n", outfile, strerror(errno));
fclose(fpi);
return 2;
}
while ((c = getc(fpi)) != EOF) {
putc(c ^ XOR_BYTE, fpo);
}
fclose(fpi);
fclose(fpo);
return 0;
}
int main(int argc, char *argv[]) {
if (argc == 3) {
xor_file(argv[1], argv[2]);
} else {
fprintf(stderr, "usage: xor_file input_file output_file\n");
}
//getch(); // avoid the need for this by running your program in the terminal
return 0;
}