2つのリンクファイルの分割

2つのリンクファイルの分割

私はAfile同等の仕事をしましたcat a.gif b.7z > Afile

Afile元のファイルa.gifb.7zファイルに分割する方法は?

ベストアンサー1

gifが終わり、7zが始まる場所を特定する必要があります。

gifファイルの元のサイズがわからない場合は、7z文字で始まるファイルの先頭を参照できます7z

運が良ければ:

grep -boa 7z Afile

(GNUがgrep非標準-bbyteオフセット)を実装または準拠していると仮定すると、-oo一致する部分のみ出力)-aaテキスト以外のファイルを含むすべてのファイル))、次のいずれかが返されます。

<offset>:7z

<offset>ファイルの先頭までファイルの7zオフセットになります。

その後、次のように抽出できます。

tail -c +<offset+1> Afile > b.7z
head -c <offset> Afile > a.gif

たとえば、grepを返す場合とを1234:7z実行します。tail -c +1235 Afile > b.7zhead -c 1234 > a.gif

複数が返されると、grepそのうちの1つは7zファイルの先頭になり、残りは70x37 0x7a(ASCIIセット合計文字値)バイトシーケンスを含むgifまたは7zファイルになります。z

どちらが正しいかを確認するには、正しい出力に似たものを返す必要があるtail -c各出力をパイプできます。または内容をリストしてみてください。file -7-zip archive databsdtar tf -

tail -c +<offset+1> Afile | file -
tail -c +<offset+1> Afile | bsdtar tf -

これbinwalkユーティリティを使用すると、ファイル内のファイル形式の署名を見つけようとしたときにプロセスを自動化できます(通常はファームウェアイメージから情報を抽出するために使用されます)。

$ binwalk Afile

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             GIF image data, version "89a", 584 x 137
8570          0x217A          7-zip archive data, version 0.4

理想的には、@Henrikがコメントで指摘したように、GIFデータが終わる場所に関する情報を取得するには、gifセクションのメタデータを調べる必要があります。 ImageMagick identify、GNU extract、perl、および画像情報を報告する一般的なツールを確認しましたが、残念ながらImage::Infoexiftoolそれらのどれもその情報を報告していません。

研究を通じて手動で実行可能GIF画像フォーマット仕様もう1つのアプローチは、画像ビューアまたはコンバータに接続して、ファイルの解析中にファイルの読み取りが停止する場所を確認することです。

giftopnm私はすぐにそれを行うことができる古代のnetpbmソフトウェアを見つけました。 zshから:

zmodload zsh/system
{
  giftopnm > /dev/null
  head -c $(( systell(0) )) < Afile > a.gif
  cat > b.7z
} < Afile

私のテストでは、giftopnmpnmに変換した後、gifファイルの末尾の位置がstdinに残ります(ここでは削除します)。

データ終了後にgifに追加情報がないと仮定すると、これは奇妙には見えません。たとえば、gallery/htmlexpo/bludown.gif有用なデータの後にランダムに見える212バイトのlibreofficeを参照してください。cut.gif~へopenjdkmat2一部のSun Microsystems著作権表示(未整理)を含む949バイト(ファイルサイズのほぼ80%)が追加されているようです。

おすすめ記事