バイナリファイルの内容を元に戻す方法

拡張子のないデータファイルが見つかったという課題を解決しました。 file コマンドは、それがデータファイル(application/octet-stream)であることを示しています。 hd コマンドの最後の行に GNP が表示されます。このファイルを元に戻すと、 .PNG 形式のファイルが表示されます。どこでも検索しましたが、バイナリファイルの内容を反転する方法が見つかりませんでした。任意の方法を提案してください。

4

5 答え

perl を使う:

 file.png
  • -a: awk mode were records are split into fields
  • -0777 -p: slurp-mode, file read into one $_ record, modified record printed afterwards.
  • -F: empty field separator, so fields are individual bytes
  • [email protected]: output record is the concatenation of the list of fields (@F) reversed.
4
追加された

xxd vim から)および tac (GNU coreutilsから、一部のシステムでは tail -r を使用)

< file.gnp xxd -p -c1 | tac | xxd -p -r > file.png
3
追加された
これを vi.stackexchange.com/a/2237/10649 と組み合わせる方法はありますか。私は運なしであらゆる種類の組み合わせを試してみました:(
追加された 著者 isa,

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
追加された
@StéphaneChazelas。なぜそれが比較的遅いのかという謎はありません。ループ内では、バイトを読み取るたびに逆方向にシークする必要があります。一度に複数のバイトを読み書きすることで、これを20倍、さらにそれ以上に簡単に大幅に減らすことができます。物事の書き込み面も同様に最適化することができます。さらにスピードアップするために、他にもたくさんのテクニックがあります。その練習はあなたに任せます。
追加された 著者 glenn mcdonald,
いいね。これが唯一の答えで、ファイル全体をメモリに保存する必要はありません。ただし、ファイルの各バイトに対して複数のシステムコール(およびbase64との間の変換)が行われるため、非常に効率が悪いため、メモリに収まらないファイルには適していません。私のマシンでは、それは約10KB/sでファイルを処理します
追加された 著者 Stéphane Chazelas,
上記の最初の read は、ファイルの最後で行われるので何も読み取らないはずです。
追加された 著者 Stéphane Chazelas,
なぜ遅いのかを理解しようとして、 strace ksh93 の下で実行してみたところ、ファイル内の至る所をシークして読み取ります。一度に大量に。多分 github.com/att/ast/issues/15 の亜種
追加された 著者 Stéphane Chazelas,
スクリプトで strace を試して、私の意味を確認してください。 ksh93 は何千回もファイルを読み込みます。たとえば、最初のバイトを読み込む前に、ファイルの末尾から64KiBをシークし、64KiBを読み込み、次に最後のバイトの前をシークして1バイトを読み込み、すべてのバイトに対して同様の処理を行います。 base64でエンコードされた文字列でできることは限られているので、一度に複数のバイトを読み取る場合、その個々のバイトを抽出するのはさらに難しくなります。
追加された 著者 Stéphane Chazelas,

zsh (内部的にバイナリデータを扱うことができる唯一のシェル( ksh93のbase64エンコーディングアプローチを考慮しない場合)):

zmodload zsh/mapfile
(LC_ALL=C; printf %s ${(s::Oa)mapfile[file.gnp]} > file.png)
  • LC_ALL=C: characters are bytes
  • $mapfile[file.gnp]: content of file.gnp file
  • s::: split the string into its byte constituents
  • Oa: reverse Order on array subscript that array
2
追加された
zsh がバイナリデータを処理できる唯一のシェルではありません。
追加された 著者 glenn mcdonald,

私は以下を試しました:

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

その考えは、「tac」に任意の文字を区切り文字として使用することを強制することです。 私はバイナリファイルでそれを試してみました、そしてそれはうまくいくように見えました、しかし、どんな確認でも評価されるでしょう。

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

0
追加された