让我解释一下我想要实现的目标:
我有一个加密的tar文件.我可以在内存中解密它,但显然我不能将解密后的数据作为真实文件写回硬盘.解密的数据被构造为内存中的char*缓冲区; 我怎么能在记忆中解开呢?
我找不到libtar库的答案.我也试着解开它execlp("tar", "tar", "-xvO", (void*)0).但它并没有像我想象的那样奏效.
任何人都可以给我一个最好的解决方案吗?谢谢!
我怀疑libtar就是答案.
使用libtar,您可以指定自己的打开/关闭,读取和写入功能.从联机帮助页:
int tar_open(TAR **t, char *pathname, tartype_t *type, int oflags,
int mode, int options);
Run Code Online (Sandbox Code Playgroud)
该
tar_open()函数打开与pathname参数命名的文件名对应的tar归档文件.该oflags参数必须是O_RDONLY或O_WRONLY.type参数指定给定文件类型的访问方法.该
tartype_t结构构件命名openfunc(),closefunc(),readfunc()和writefunc(),它们是指向用于打开的功能,关闭,读取和写入文件,分别.如果类型是NULL,文件类型默认为一个正常的文件,和标准open(),close(),read(),和write()所使用的功能.
我做了一个例子,如何从内存中的tar读取文件内容.该is_file_in_tar()函数返回length与start所述的荷兰国际集团位置named文件,如果它被存储在tar:
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <sys/mman.h>
struct tar {
char name[100]; char _unused[24];
char size[12]; char _padding[376];
} *tar;
int is_file_in_tar( struct tar *tar, char *name, char **start, int *length ){
for( ; tar->name[0]; tar+=1+(*length+511)/512 ){
sscanf( tar->size, "%o", length);
if( !strcmp(tar->name,name) ){ *start = (char*)(tar+1); return 1; }
}
return 0;
}
int main(){
int fd=open( "libtar-1.2.11.tar", O_RDONLY );
tar=mmap(NULL, 808960, PROT_READ, MAP_PRIVATE, fd, 0);
char *start; int length; char name[]="libtar-1.2.11/TODO";
if( is_file_in_tar(tar,name,&start,&length) ) printf("%.*s",length,start);
}
Run Code Online (Sandbox Code Playgroud)