为什么我的输出包含额外的字符?为什么通过记事本++只加密每个文件的第一行而不是整个文件? 快乐编码! 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]");
}
}
您的
XOR_FILE
原型不正确:您应该采用 2 个字符串。
您的代码中还有更多问题:
fseek
和 ftell
可靠地获取文件大小,通常不需要它,无论如何您都可以使用固定大小的缓冲区实现缓冲版本。for (i = 0; i < newLen; i++)
否则您将在加密时输出一个额外的字节,在解密时再输出一个。 .'\0'
中的XOR_BUFFER(char *FILE_BUFFER)
,传递尺寸并使用。否则,您将无法加密包含空字节的二进制文件。fpo
关闭
fclose(fpo);
getchar()
和putchar()
。这是一个简化版本:
#include <errno.h>
#include <stdio.h>
#include <string.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(stderr, "cannot open input file %s: %s\n", infile, strerror(errno));
return 1;
}
if ((fpo = fopen(outfile, "wb")) == NULL)
fprintf(stderr, "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[]) {
int status;
if (argc == 3) {
status = xor_file(argv[1], argv[2]);
} else {
fprintf(stderr, "usage: xor_file input_file output_file\n");
status = 3;
}
//getch(); // avoid the need for this by running your program in the terminal
return status;
}
您正在将字符串传递到需要 FILE* 参数的函数中。这告诉我编译器正在向你抱怨长时间而你却忽略了它
此外,您没有测试 fopen 函数的任何返回值。
所以修复这两件事然后重新发布