将 char* 转换为 FILE* 而不保存文件
cast char* to FILE* without saving the 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,但只是将它保存到内存。
谢谢 :)
解密数据后,您可以创建一个管道将解密后的数据送入,然后您可以return管道的读取端读取数据。
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");
}
我正在尝试以 "rb" 模式打开现有文件,我需要解密返回一个新文件*,而不覆盖原始文件或创建新的临时文件。 简而言之,我需要这样的东西:
FILE *decrypt(){
FILE *cryptedfile = fopen("file.ext", "rb");
//... my decrypter code
return (the decrypted file as FILE*).
}
所以,有一种方法可以做到 "cast char* to FILE*"?
我尝试了很多不同的解决方案但都没有成功,我也尝试过创建一个新的 tmpfile() 但结果似乎无法正常工作而且我不想创建一个 tmpfile,但只是将它保存到内存。
谢谢 :)
解密数据后,您可以创建一个管道将解密后的数据送入,然后您可以return管道的读取端读取数据。
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");
}