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アーカイブファイルを開きます。引数はpathnameまたはのいずれかでなければなりません。oflagsO_RDONLYO_WRONLY

type引数は、指定されたファイルタイプのアクセス方法を指定します。tartype_t構造体には、、、、およびという名前のメンバーがありopenfunc()ます。これらのメンバーは、それぞれファイルを開く、閉じる、読み取る、および書き込むための関数へのポインターですclosefunc()。 typeが、の場合、ファイルタイプはデフォルトで通常のファイルになり、標準の、、、および 関数 が 使用されます。readfunc()writefunc()NULLopen()close()read()write()

于 2009-10-12T09:54:01.710 に答える
7

メモリ内の tar からファイルの内容を読み取る方法の例を作成しました。このis_file_in_tar()関数は、 d ファイルが次の場所に格納されている場合、そのファイルの位置をlength返します。startnametar

#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

私はこのコードでそれを行いました。それを試してみてください!

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 に答える
2

stdout にリダイレクトされた tar ユーティリティを実行できます。( tar --to-stdout)。出力を読み取るには、forkpty()またはを使用して実行する必要があります。popen()

于 2009-10-12T10:28:27.043 に答える
0

通常の untar 操作を使用して、メモリ内の tmpfs に untar するだけです。

于 2009-10-12T10:01:23.693 に答える