приведите char * к FILE * без сохранения файла - PullRequest
0 голосов
/ 24 октября 2018

я пытаюсь открыть существующий файл в режиме "rb", и мне нужно расшифровать, возвращая новый ФАЙЛ * без перезаписи исходного файла или создания нового временного.Короче говоря, мне нужно что-то вроде этого:

FILE *decrypt(){
    FILE *cryptedfile = fopen("file.ext", "rb");

    //... my decrypter code

    return (the decrypted file as FILE*).
}

Итак, есть способ сделать что-то вроде «бросить char * to FILE *»?

Я пробовал много разных решенийбезуспешно, я также пытался создать новый tmpfile (), но результат, кажется, не работает должным образом, и я не хочу создавать tmpfile в любом случае, но просто сохранить его в памяти.

спасибо :)

1 Ответ

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

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

FILE *decrypt(){
    FILE *cryptedfile = fopen("file.ext", "rb");

    char *data;
    int len;
    // load decrypted data into "data" and length info "len"

    int p[2];
    if (pipe(p) == -1) {
        perror("pipe failed");
        return NULL;
    }

    int rval;
    if ((rval = write(p[1], data, len)) == -1) {
        perror("write failed");
        close(p[0]);
        close(p[1]);
        return NULL;
    } else if (rval < len) {
        printf("write failed, wrote %d, expected %d\n", rval, len);
        close(p[0]);
        close(p[1]);
        return NULL;
    }

    return fdopen(p[0], "r");
}

В качестве альтернативы вы также можете использоватьfmemopen:

FILE *decrypt(){
    FILE *cryptedfile = fopen("file.ext", "rb");

    char *data;
    int len;
    // load decrypted data into "data" and length info "len"

    return fmemopen(data, len, "rb");
}
...