私はAfile
同等の仕事をしましたcat a.gif b.7z > Afile
。
Afile
元のファイルa.gif
とb.7z
ファイルに分割する方法は?
ベストアンサー1
gifが終わり、7zが始まる場所を特定する必要があります。
gifファイルの元のサイズがわからない場合は、7z
文字で始まるファイルの先頭を参照できます7z
。
運が良ければ:
grep -boa 7z Afile
(GNUがgrep
非標準-b
(b
yteオフセット)を実装または準拠していると仮定すると、-o
(o
一致する部分のみ出力)-a
(a
テキスト以外のファイルを含むすべてのファイル))、次のいずれかが返されます。
<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.7z
head -c 1234 > a.gif
複数が返されると、grep
そのうちの1つは7zファイルの先頭になり、残りは7
0x37 0x7a(ASCIIセット合計文字値)バイトシーケンスを含むgifまたは7zファイルになります。z
どちらが正しいかを確認するには、正しい出力に似たものを返す必要があるtail -c
各出力をパイプできます。または内容をリストしてみてください。file -
7-zip archive data
bsdtar 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::Info
、exiftool
それらのどれもその情報を報告していません。
研究を通じて手動で実行可能GIF画像フォーマット仕様もう1つのアプローチは、画像ビューアまたはコンバータに接続して、ファイルの解析中にファイルの読み取りが停止する場所を確認することです。
giftopnm
私はすぐにそれを行うことができる古代のnetpbm
ソフトウェアを見つけました。 zshから:
zmodload zsh/system
{
giftopnm > /dev/null
head -c $(( systell(0) )) < Afile > a.gif
cat > b.7z
} < Afile
私のテストでは、giftopnm
pnmに変換した後、gifファイルの末尾の位置がstdinに残ります(ここでは削除します)。
データ終了後にgifに追加情報がないと仮定すると、これは奇妙には見えません。たとえば、gallery/htmlexpo/bludown.gif
有用なデータの後にランダムに見える212バイトのlibreofficeを参照してください。cut.gif
~へopenjdk
mat2
一部のSun Microsystems著作権表示(未整理)を含む949バイト(ファイルサイズのほぼ80%)が追加されているようです。