web-dev-qa-db-ja.com

バイナリファイルの内容を元に戻すには?

ファイル拡張子のないデータファイルを見つけました。 fileコマンドは、それがdata file (application/octet-stream)であることを示しています。 hdコマンドは、最終行にGNP。を示します。したがって、このファイルを元に戻すと、。PNG形式のファイルが表示され、どこでも検索しましたが、バイナリファイルの内容を元に戻す方法を説明する解決策が見つかりませんでした。

11
Prvt_Yadav

xxd(from vim)およびtac(from GNU coreutils、from tail -r一部のシステムでは):

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

Perlの場合:

<file.gnp Perl -0777 -F -ape '$_=reverse@F' > file.png
  • -aawkモードはレコードがフィールドに分割されました
  • -0777 -p:スラップモード、1つに読み込まれたファイル$_レコード、変更されたレコードは後で印刷されます。
  • -F:フィールド区切り文字が空なので、フィールドは個々のバイトです
  • $_=reverse@F:出力レコードは、フィールドのリストを連結したものです(@F)逆。
7

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:配列Orrayの逆arder配列
4

これは、ksh93を使用してバイナリファイルを元に戻す1つの方法です。わかりやすくするために、コードを「緩い」ままにしました。

#!/bin/ksh93

typeset -b byte

redirect 3< image.gpj || exit 1

eof=$(3<#((EOF)))

read -r -u 3 -N 1 byte
printf "%B" byte > image.jpg
3<#((CUR - 1))

while (( $(3<#) > 0 ))
do
    read -r -u 3 -N 1 byte
    printf "%B" byte >> image.jpg
    3<#((CUR - 2))
done

read -r -u 3 -N 1 byte
printf "%B" byte >> image.jpg

redirect 3<&- || echo 'cannot close FD 3'

exit 0
2
fpmurphy

Perlの場合:

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の実行時間は、出力が同じであるため、すべてのソリューションで同じである必要があります。

2
user202729

私は以下を試しました:

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

アイデアは、セパレータとして任意の文字を使用して「tac」を強制することです。バイナリファイルで試してみましたが、問題はないようですが、確認をお願いします。

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

1
Bouteille

これはうまくいくようです:

tac  -r -s '.*' foo > oof 

すべての可能なバイトで256バイトのファイルを作成してテストし、それを逆にします。

printf '%.2x\n' {0..255} | xxd -r -p | tac  -r -s '.*' | 
od -A none -t u1 | tee >(head -1 > /dev/stderr) | 
{ sleep 1; echo ...; tail -1 ; }

出力:

 255 254 253 252 251 250 249 248 247 246 245 244 243 242 241 240
...
  15  14  13  12  10  11   9   8   7   6   5   4   3   2   1   0

...、(i.e。 more of the same)の内容を確認するには、| tee以降のすべてを省略します。

0
agc