Преобразовать char * в FILE * без сохранения файла

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

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

    //... my decrypter code

    return (the decrypted file as FILE*).
}

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

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

Благодарность:)

Единственный способ получить действующий FILE * - использовать fopen. Почему бы вам просто не вернуть расшифрованное содержимое в виде массива байтов?

Fiddling Bits 24.10.2018 19:12

Вы уже «конвертировали» свой const char* в FILE*, когда звонили в fopen.

François Andrieux 24.10.2018 19:12

Конечно, мой код дешифратора обработает содержимое файла и вернет его как char *, но мне нужно снова преобразовать его в FILE *, не сохраняя его.

Giuseppe 24.10.2018 19:14
return (the decrypted file as FILE*)., тогда вам нужно создать новый файл, который будет расшифрован, и записать в него, закрыть его, а затем снова открыть для чтения. Кажется странным или, по крайней мере, небезопасным требованием.
drescherjm 24.10.2018 19:15

Почему? Для чего нужен FILE *? Что плохого в том, что char * указывает на расшифрованные данные?

dbush 24.10.2018 19:15

мне нужен FILE *, а не char *, потому что я использую сторонний код, который требует FILE * для выполнения других процессов. :(

Giuseppe 24.10.2018 19:17

я не хочу создавать новый временный файл, так как зашифрованные данные ценны: \

Giuseppe 24.10.2018 19:19

Если вы используете POSIX-совместимую систему, вы можете использовать fmemopen().

user10543939 24.10.2018 19:22

Кроссплатформенность: github.com/Snaipe/fmem

user10543939 24.10.2018 19:27

Тот же вопрос: stackoverflow.com/q/24683052/3002139

Baum mit Augen 24.10.2018 19:27

Возможные дубли: stackoverflow.com/q/5135854/3002139stackoverflow.com/q/539537/3002139

Baum mit Augen 24.10.2018 19:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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");
}

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

Shawn 24.10.2018 19:34

@Shawn Если это произойдет, вы получите сообщение об ошибке записи. В Linux по умолчанию установлено значение 64 КБ, но его можно увеличить с помощью fcntl, используя опцию F_SETPIPE_SZ.

dbush 24.10.2018 19:37

Спасибо всем за эти ответы за такое короткое время @dbush. Я попробовал ваш код, и он работает, но, похоже, работает только в том случае, если char * не содержит пробелов. если данные содержат пробел, программа продолжает работать, ничего не делая.

Giuseppe 24.10.2018 22:59

@ Джузеппе рад, что смог помочь. Не стесняйтесь [принять этот ответ [(stackoverflow.com/help/accepted-answer), если вы сочли его полезным.

dbush 24.10.2018 23:01

извините, не пробелы, но возвращает символ типа "\ n"

Giuseppe 24.10.2018 23:04

Я объясню, например: если я установил data = "helloworld" и len = 10, он работает отлично. но если data = "hello world" и len = 11, программа ничего не делает; но если len = 5 (до «o» в «hello»), он работает, записывая только слово «hello». что случилось?

Giuseppe 24.10.2018 23:13

Я исправил заменой pipe (p) на _pipe (p, len, O_BINARY)

Giuseppe 24.10.2018 23:36

Другие вопросы по теме