如何在C中对文件缓冲区进行异或并输出到新文件[关闭]

问题描述 投票:0回答:2

为什么我的输出包含额外的字符?为什么通过记事本++只加密每个文件的第一行而不是整个文件? 快乐编码! 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]");
    }
}
c file encryption
2个回答
0
投票

您的

XOR_FILE
原型不正确:您应该采用 2 个字符串。

您的代码中还有更多问题:

  • 您必须学会缩进代码并明智地使用空格。使用书中所示的 Kernighan 和 Ritchie 风格。
  • 您无法使用
    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;
}

0
投票

您正在将字符串传递到需要 FILE* 参数的函数中。这告诉我编译器正在向你抱怨长时间而你却忽略了它

此外,您没有测试 fopen 函数的任何返回值。

所以修复这两件事然后重新发布

© www.soinside.com 2019 - 2024. All rights reserved.