4

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

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

我找不到 libtar 库的答案。我也尝试用execlp("tar", "tar", "-xvO", (void*)0). 但它并没有像我想象的那样工作。

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

4

5 回答 5

8

我怀疑libtar是答案。

使用 libtar,您可以指定自己的打开/关闭、读取和写入函数。从手册页:

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

tar_open()函数打开一个与参数命名的文件名相对应的 tar 归档文件pathnameoflags参数必须是O_RDONLYO_WRONLY

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

于 2009-10-12T09:54:01.710 回答
7

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

#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);
}
于 2009-10-12T19:22:11.817 回答
2

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

于 2009-10-12T10:28:27.043 回答
2

我已经用这段代码做到了。尝试一下!

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

}
于 2011-06-14T01:46:44.150 回答
0

只需使用正常的解压缩操作解压缩到内存中的 tmpfs。

于 2009-10-12T10:01:23.693 回答