0

データの最初のブロックがASCIIメタデータであるカスタム画像ファイルがあります。JavaでファイルのこのASCIIメタデータ部分を読み取り、それがいつ終了し、別のエンコーディングの「生の画像データ」がいつ開始するかを知る必要があります。

私はすべてのファイルをbyte[]に読み込むことを考えていましたが、どういうわけか、これからバイトの読み取りを開始し、asciiメタデータセクションの最後に到達するまでASCIIに変換します。この時点で、これを保存します。データ。次に、生のバイナリデータをそのまま別の順序に並べ替えることができます(読み取る必要はありません)。ただし、これを行うことについて考えることができる唯一の方法は、ASCIIのものをバイトごとに読み取り、新しい行を探し、新しい行の前にすべてを連結して、それがの始まりを示すタグであるかどうかを確認することです。生の画像データ。ただし、readLine()を使用してファイルのASCII部分を読み取り、新しいリーダーでファイルを再度開いて、他の読者私は「画像の始まり」を見つけました

何か案は?

4

2 に答える 2

1
  • FileInputStream(でラップされたBufferedInputStream)としてファイルを開きます
  • 作成するByteArrayOutputStream
  • 文字列検索アルゴリズムを使用して「beginimage」タグを探し、入力ストリームをバイトごとに読み取ります。個々のバイトをにキャストしますchar(暗黙的にASCIIを使用しています)
  • 同時に、調べた各バイトをに書き込みますByteArrayOutputStream
  • タグを見つけたら、入力ストリームから画像データの読み取りを開始できます
  • からバイト配列を取得し、ByteArrayOutputStreamを使用して文字列に変換しますnew String(array, "US-ASCII");

入力ストリームでを使用して文字列検索を簡単に実行できるScanner場合がありますが、画像データの読み取りを開始せずにタグが確実に検出されるように、使用するパターンに注意する必要があります(これを読み取りたいため)個別の参照を保持している基になる入力ストリームから自分自身)。

編集:残念ながら、Scannerは暗黙的にバッファも使用しているように見えるため、残された唯一のオプションは文字列検索を「手動で」実装することです。

于 2009-08-27T09:24:33.197 に答える
1

フォーマットを自分で決めることができるかどうかはわかりませんが、とにかく:

別の戦略は、ファイルの最初の場所に整数値を書き込むことです。これには、ASCIIパーティションに使用されるバイト数が含まれます。次に、その量のバイトを読み取ることができます。また、ASCIIをスキップして、バイナリブロブに直接移動することもできます。

この戦略は効率的ですが、カウントを変更せずにASCIIテキスト文字の量を変更することはできません。

ちなみに、入力をサニタイズするようにしてください。ファイルに含まれているデータよりも多くのデータを読み取ろうとしたり、マシンが可能な以上のメモリを割り当てたりしないでください。

個人的には、ファイルの最初の数文字を使用して魔法のコードを含め、ファイルがデータ形式を使用していることと、データ形式のバージョンを最小限に抑えられるようにします。

于 2009-08-27T09:45:17.430 に答える