如何在内存中解压缩文件(c编程)?

让我解释一下我想要实现的目标:

我有一个加密的tar文件。 我可以在内存中解密它,但显然我不能将解密后的数据作为真实文件写回硬盘。 解密数据在内存中构造为char *缓冲区; 我怎么能在记忆中解开呢?

我找不到libtar库的答案。 我还尝试使用execlp("tar", "tar", "-xvO", (void*)0)解压缩它。 但它并没有像我想的那样奏效。

任何人都可以给我一个最好的解决方案吗? 谢谢!

我举了一个例子,如何从内存中的tar读取文件内容。 如果存储在tar ,则is_file_in_tar()函数返回name d文件的lengthstart位置:

 #include  #include  #include  #include  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); } 

我怀疑libtar就是答案。

使用libtar,您可以指定自己的打开/关闭,读取和写入function。 从联机帮助页:

 int tar_open(TAR **t, char *pathname, tartype_t *type, int oflags, int mode, int options); 

tar_open()函数打开一个tar归档文件,该文件对应于pathname参数指定的文件pathnameoflags参数必须是O_RDONLYO_WRONLY

type参数指定给定文件类型的访问方法。 tartype_t结构具有名为openfunc()closefunc()readfunc()writefunc() ,它们分别是指向打开,关闭,读取和写入文件的函数的指针。 如果type为NULL ,则文件类型默认为普通文件,并使用标准的open()close()read()write()函数。

您可以执行重定向到stdout的tar实用程序。 ( tar --to-stdout )。 您应该使用forkpty()popen()运行它以读取输出。

我已用此代码完成了这项工作。 试试吧!

 FILE*fp; if( fp = popen("/bin/tar -xv -C /target/dir", "w") ) { fwrite(tar_buffer,1,tar_size,fp); pclose(fp); printf("Untar End %d Save file\n", tar_size); } 

使用正常的untar操作解压缩内存中的tmpfs。