間違った FTP モードでアップロードされた破損したファイルの回復

間違った FTP モードでアップロードされた破損したファイルの回復

いくつかのファイルは間違ったモードで FTP にアップロードされました (コマンド ライン経由)。TEXT モードでアップロードされたバイナリ ファイルがあると思いますが、それらを開くことができません。

元のファイルにアクセスできないのですが、どうにかして回復できますか? ファイルを正しい形式で取得できるツールはありますか?

答え1

最近、同じ問題に直面しました。Linux -> Windows、ASCII モード。ASCII で転送されたバイナリを復元できる Python のプログラムを書き終えました。これはバイト ブルートフォーサーで、その仕組みは次のとおりです。

  1. 破損したアーカイブをバイト ストリームとして開きます。
  2. 0d の後に 0a (ASCII 13、ASCII 10) が続くすべての出現を検索します。
  3. 0d の後に 0a が続くすべての出現を削除し、バイト アドレスを保存します。
  4. 各アドレスを循環して、バイナリ内に存在するはずの 0d の数を復元し、復元して開こうとします (私の場合は bz2 アーカイブを扱っており、CRC チェックサム アルゴリズムを使用して、圧縮されていないデータの整合性をチェックし、アーカイブにハードコードされているデータと照合しました)。

バイナリ内の有効な 0d 0a バイト ペアの数はそれほど多くありません。バイナリに有効な 0d 0a ペアが存在する可能性は非常に低いです。このブルートフォース メソッドを使用して bz2 アーカイブを修正するのにかかる時間は、100kb 未満のファイルの場合 10 秒未満です。他の種類のファイルでは確認していませんが、可能です。

この質問はプログラミングに関連したものではなく、一種の競争課題であり、ソースを公開することに抵抗があるため、ここにコードを貼り付けるつもりはありませんが、必要な場合はお知らせください。

みなさん、メリークリスマス! :)

答え2

破壊を元に戻すことが可能かどうかを知るには、関係するオペレーティング システムを知る必要があります。結果は、サーバーとクライアントで使用するオペレーティング システムの組み合わせによって異なります。

最も深刻な問題は、行末文字です。Windows では、キャリッジ リターン (ASCII 値 13) の後にライン フィード (ASCII 値 10) が続きますが、Linux ではライン フィードのみが使用されます。

テキスト モードの FTP 転送ではこれが変換されます。バイナリ モードでは変換されません。ここで破壊が発生します。

Windows から Linux に転送された場合、LF が元々 LF であったか、CR-LF の組み合わせであったかを判断することは不可能です。データが失われるため、破壊を元に戻すのはほぼ不可能です。

答え3

他の人が指摘しているように、データは破損しており、回復できない可能性があります。

ただし、0x0D 0x0A は、ほとんどのバイナリ ファイル形式では特に一般的なバイト シーケンスではありません [引用が必要]。そのため、それらを置き換えて、ファイルが修正されるかどうか試してみる価値はあります。

fixgz ユーティリティまさにそれを行います。名前にもかかわらず、.gzip ファイルに固有のものではなく、どのファイルでも使用できます。

幸運を!

関連情報