バイナリファイルの内容をどのように戻しますか?

バイナリファイルの内容をどのように戻しますか?

私は問題を解決していましたが、私は次のようなものを見つけました。データファイルファイル拡張子がありません。コマンドはfileそれがあることを示していますdata file (application/octet-stream)hd国民総生産。最後の行に。したがって、このファイルを逆にすると、次のような結果が得られます。.PNG私はフォーマットファイルを見つけるためにどこでも検索しましたが、バイナリファイルの内容を元に戻す方法を説明する解決策が見つかりませんでした。

答え1

xxd(でvim)とtac(GNU coreutilsでは、tail -r一部のシステムでも)を使用してください。

< file.gnp xxd -p -c1 | tac | xxd -p -r > file.png

答え2

In zsh(内部的にバイナリデータを処理できる唯一のシェルです(考慮したくない場合)。ksh93のbase64エンコーディング)):

zmodload zsh/mapfile
(LC_ALL=C; printf %s ${(s::Oa)mapfile[file.gnp]} > file.png)
  • LC_ALL=C:文字はバイトです。
  • $mapfile[file.gnp]file.gnp:文書内容
  • s:::文字列をバイトコンポーネントに分割します。
  • Oa:Oリバースソート配列添字a

答え3

パールの使用:

perl -0777pe '$_=reverse $_'  [input_file]

性能試験:

dd if=/dev/urandom of=/tmp/a bs=1M count=1
LC_ALL=C tac -rs $'.\\|\n' /tmp/a > /tmp/r

time perl -0777pe '$_=reverse $_' /tmp/a         | diff -q - /tmp/r
time xxd -p -c1 /tmp/a | tac | xxd -p -r         | diff -q - /tmp/r
time perl -0777 -F -ape '$_=reverse@F' /tmp/a    | diff -q - /tmp/r
time LC_ALL=C tac -rs $'.\\|\n' /tmp/a           | diff -q - /tmp/r

結果:

  • ローカルテスト:私のソリューションは最も速く、perl -0777 -F最も遅いです。
  • テスト対象オンラインでお試しください!:私の解決策は最も速く、xxd最も遅いです。

注:すべてのソリューションの実行時間はdiff出力と同じでなければなりません。

答え4

私は以下を試しました:

tac -rs '.' input.gnp > output.png

アイデアは、「tac」がすべての文字を区切り文字として使用するように強制することです。バイナリで試してみましたが、うまくいくようです。確認していただきありがとうございます。

最大の利点は、ファイルをメモリにロードしないことです。

関連情報