0

ビジュアル C++ アプリケーションを開発しています。tarファイル内に存在するファイルタイプ(.pngファイルまたは.htmlファイルまたは.txtファイルが含まれているかどうかを意味します)を知る必要があります(C ++プログラミングによるだけです)-コマンドを処理するものは何もありません。以下のリンクについてある程度の知識があり ます-ここでtarファイルを解析する方法 は、バッファ[512]にあるファイルの内容がtarファイル内にあるという情報を入手しました.私の最初の質問は

(1.) tar に複数のファイルが存在し、その場所からサイズを取得したとします (&buffer[124], 11); 512からファイルのサイズまで、そのファイルのコンテンツがあり、個人的な使用のためにバッファに保存しました。 tar ファイル内。3/4 の位置にあるファイルの位置、内容、およびサイズを取得する必要がある場合 (tar ファイルに存在するファイルの位置がわからない場合) ???

(2.) 私の考えは正しいですか?次のファイルの内容に移動する必要がある場合は、512 * 2 を実行する必要があります (最初のファイルの内容は 512 の場所から始まるため、次のファイルは 1024 にあるためです。これは間違ったアプローチであると確信していますが、修正してください。 ?)。

実際には、tar ファイル (さまざまな種類のファイルの数を含む) からバッファーに Html ファイルの内容のみを保存する必要があります。

4

1 に答える 1

2

tar ファイルの内容は、常にヘッダー ブロックデータ ブロックヘッダー ブロックデータ ブロック... であり、各ヘッダー ブロックには 1 つのファイルのすべての情報 (ファイル名、サイズ、権限など) が含まれ、次のデータ ブロックには次の内容が含まれます。ファイルの内容。各データ ブロックのサイズは、ヘッダー ブロックにあるファイル サイズの 512 の次の倍数です (この文は私にはひどいものに見えます。ネイティブ スピーカーで正しい方を教えてください)。したがって、1 つのヘッダー ブロックを読み終えて、次のヘッダー ブロックにスキップしたい場合は、次の計算を行います。

 size_t skip = filesize % 512 ? filesize + 512 - (filesize % 512) : filesize

または、よりパフォーマンス的に

 size_t skip = filesize + 511 & ~512;

skipバイトを前方にシークします。

たとえば、tar ファイルにサイズ 12345 のa.bin (次の 512 の倍数は 12800) とサイズ 123 のb.txt (次の 512 の倍数は -- 明らかに -- 512) の 2 つのファイルが含まれている場合、次のようになります。

  1. Pos で始まるa.binに関する情報を含むヘッダー。0
  2. Pos から始まるa.binのデータ。512
  3. Pos で始まるb.txtに関する情報を含むヘッダー。512 + 12800 = 13312
  4. Pos から始まるb.txtのデータ。13312 + 512 = 13824
  5. tar ファイルのファイル サイズは、少なくとも 13824 + 512 = 14324 になります。実際には、tar ファイルの方が大きく、次の 512 バイトが位置にあることが一般的にわかります。14324になります\0
于 2013-07-25T15:45:12.523 に答える