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

时间:2009-10-12 09:50:41

标签: c tar

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

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

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

任何人都能给我一些最好的解决方案吗?谢谢!

5 个答案:

答案 0 :(得分:8)

我怀疑libtar就是答案。

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

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

tar_open()函数打开与之对应的tar归档文件   文件名由pathname参数命名。必须是oflags参数   O_RDONLYO_WRONLY

     

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

答案 1 :(得分:7)

我做了一个例子,如何从内存中的tar读取文件内容。 is_file_in_tar()函数返回length d文件的startname位置,如果它存储在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);
}

答案 2 :(得分:2)

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

答案 3 :(得分: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);

}

答案 4 :(得分:0)

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