почему моя программа XOR не работает на Windows, когда исполняемые файлы XORing - PullRequest
1 голос
/ 30 января 2020

Я написал программу XOR на C. Цель программы - XOR-файлы, я тестировал эту программу на Linux, так как она является моей основной ОС, и она отлично работала с «.exe» (я использовал wine для запуска exe на Linux). Однако, когда программа была протестирована на Windows, я заметил, что теряю байты данных, когда я XORed файл, и я не знаю, почему, если кто-то может пролить свет на ситуацию, это будет очень полезно. Ниже я разместил код в моей программе XOR.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>

//XOR key
#define XOR_KEY 0x6F

void XORFile(char *infile, char *outfile)
{
    FILE *fp;
    FILE *fp2;
    int rlen;
    char buf[4096];

    fp = fopen(infile, "r");
    fp2 = fopen(outfile, "w");

    while (1) {
        rlen = fread(buf,1,sizeof(buf),fp);
        if (rlen <= 0)
            break;

        // XOR read file buffer
        for (int i = 0; i < rlen;  ++i)
            buf[i] ^= XOR_KEY;

        fwrite(buf,1,rlen,fp2);
    }

    fclose(fp);
    fclose(fp2);
}

int main (int argc, char *argv[]) {
    if(argc <= 3){
        fprintf (stderr, "Usage: %s [CRYPT] [IN FILE] [OUTFILE]\n", argv[0]);
        exit(1);
    }

    XORFile (argv[2], argv[3]);

    return 0;
}

1 Ответ

1 голос
/ 31 января 2020

Как указано в комментариях, вы должны использовать режимы "rb" и "wb" в своих вызовах fopen (добавленный b открывает / создает файл в режиме двоичный ).

В режиме text (по умолчанию) Windows выполняет некоторую специальную обработку определенных символов (например, преобразование между одной парой \n и парой \r\n).

From cppreference :

Текстовые файлы - это файлы, содержащие последовательности строк текста. В зависимости от среды, в которой выполняется приложение, в операциях ввода / вывода в текстовом режиме может происходить специальное преобразование символов, чтобы адаптировать их к системному формату c текстового файла. Хотя в некоторых средах преобразования не выполняются, и текстовые и двоичные файлы обрабатываются одинаково, использование соответствующего режима улучшает переносимость.

...