Заменить Fread на Base64 кодировать двоичные данные? - PullRequest
0 голосов
/ 03 мая 2019

Нужна помощь с моим C, он слишком долго пытался заставить этот маленький скрипт работать.

Здесь я включил библиотеку base64

У меня есть данные двоичного файла, закодированные в строку base64.

И в основном пытается передать данные из строки в кодировке base64 в функцию вместо использования fread. Кроме того, строка в кодировке base64 довольно велика (от 500 тыс. До миллионов символов).

#include "base64.h"

...

static int _process()
{
    byte_t  daata[2048]        = {0};
    size_t int1                = 2048;
    size_t int2                = 2048;
    unsigned char s1[10000000] = "dGVzdGluZzEyMw==";

    printf("%s", s1);

    // TODO: Not sure how to call this properly.
    base64_decode(s1, int1, int2);

    // TODO: Replace this with data from base64 decoded char rather than file.
    read_size = fread(data, sizeof(char), 2048, p_file);

    while (read_size > 0)
    {
        write_data(
            handle,
            data,
            read_size
        );

        // TODO: Continue reading until string is empty?
        read_size = fread(data, sizeof(char), 2048, p_file);
    }
}

1 Ответ

0 голосов
/ 03 мая 2019

Если вас беспокоит размер файла и, по-видимому, перенос всего объекта в память за один раз, вам придется

  1. чтение фрагмента входного файла
  2. декодировать кусок
  3. записать декодированные данные в выходной файл

в цикле, пока вы не закончите чтение. Таким образом, вы работаете только с одним блоком за раз в памяти. Обратите внимание, что в реализации 1012 * вы несете ответственность за удаление того, что дает вам base64_decode. Он каждый раз что-то выделяет для вас.

Грубо ...

size_t chunk_size = 2048;
size_t read_size = 0;
size_t write_size = 0;
unsigned char* encoded_data = malloc(sizeof(unsigned char) * chunk_size);

//...open input file and output file...
read_size = fread(encoded_data, sizeof(unsigned char), chunk_size, input_file);
while (read_size > 0)
{
    unsigned char* decoded_data = base64_decode(encoded_data, read_size, &write_size);
    fwrite(decoded_data, sizeof(unsigned char), write_size, output_file);
    free(decoded_data);
    read_size = fread(encoded_data, sizeof(unsigned char), chunk_size, input_file);
}
//...close files

free(encoded_data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...