C ++ - чтение байтов любого файла в массив без знака - PullRequest
0 голосов
/ 20 октября 2019

У меня есть задание, где я должен реализовать алгоритм Rijndael для шифрования AES-128. У меня есть работающий алгоритм, но у меня нет правильного ввода / вывода файла.

Назначение требует, чтобы мы использовали параметры, переданные из командной строки. В этом случае в качестве параметра будет указан путь к файлу, который пользователь хочет зашифровать.

Моя проблема в том, что я заблудился в том, как читать байты файла и хранить эти байты внутримассив для последующего шифрования.

Я пытался использовать ifstream и ofstream для открытия, чтения, записи и закрытия файлов, и он отлично работает для текстовых файлов. Однако мне нужно, чтобы приложение принимало ЛЮБОЙ файл в качестве входных данных.

Когда я попробовал использовать метод fstream с использованием pdf в качестве входных данных, моя программа вылетала. Итак, теперь мне нужно научиться брать байты файла, хранить их в массиве без знака для шифрования, а затем хранить их в другом файле. Этот процесс шифрования и хранения зашифрованного текста должен происходить с интервалом в 16 байт.

Приведенная ниже реализация является моей первой попыткой чтения файлов в двоичном режиме и последующей записи того, что было прочитано в другом файле, также в двоичном режиме. Вывод доступен для чтения в шестнадцатеричном считывателе.

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        cerr << "Use: " << argv[0] << " SOURCE_FILEPATH" << endl << "Ex. \"C\\Users\\Anthony\\Desktop\\test.txt\"\n";
        return 1;
    }

    // Store the Command Line Parameter inside a string
    // In this case, a filepath.
    string src_fp = argv[1];
    string dst_fp = src_fp.substr(0, src_fp.find('.', 0)) + ".enc";

    // Open the filepaths in binary mode
    ifstream srcF(src_fp, ios::in | ios::binary);
    ofstream dstF(dst_fp, ios::out | ios::binary);

    // Buffer to handle the input and output.
    unsigned char fBuffer[16];

    srcF.seekg(0, ios::beg);
    while (!srcF.eof())
    {
        srcF >> fBuffer;

        dstF << fBuffer << endl;
    }

    dstF.close();
    srcF.close();
}

Реализация кода работает не так, как задумано.

Будем весьма благодарны за любые указания относительно того, как решить мою дилемму.

1 Ответ

0 голосов
/ 24 октября 2019

Как и вы, я действительно изо всех сил пытался найти способ чтения двоичного файла в байтовый массив в C ++, который бы выводил те же шестнадцатеричные значения, которые я вижу в шестнадцатеричном редакторе. После долгих проб и ошибок это, кажется, самый быстрый способ сделать это без лишних приведений.

Без счетчика все шло бы быстрее, но иногда вы получаете широкие символы. Чтобы действительно получить один байт за раз, я не нашел лучшего способа.

По умолчанию он загружает весь файл в память, но печатает только первые 1000 байтов.

string Filename = "BinaryFile.bin";
FILE* pFile;
pFile = fopen(Filename.c_str(), "rb");
fseek(pFile, 0L, SEEK_END);
size_t size = ftell(pFile);
fseek(pFile, 0L, SEEK_SET);
uint8_t* ByteArray;
ByteArray = new uint8_t[size];
if (pFile != NULL)
{
    int counter = 0;
    do {
        ByteArray[counter] = fgetc(pFile);
        counter++;
    } while (counter <= size);
    fclose(pFile);
}
for (size_t i = 0; i < 800; i++) {
    printf("%02X ", ByteArray[i]);
}
...