2

バイナリ ファイルからデータを 16 進文字列として提供する必要があります。このための現在の実装では、ファイル全体をメモリにロードし、それを 16 進文字列に変換して、16 進文字列を別のコンポーネントにバイト配列としてフィードします。

私が今直面している問題は、このファイルが非常に大きい場合があるため、「OutOfMemoryException」が発生することです。このコンポーネントは InputStream も入力として受け入れるので、FileInputStream を、ファイルを 16 進文字列として返す別のストリームにラップすると考えました。

ただし、これを行う方法がわかりません。InputStream のサブクラス化は簡単に思えますが、さまざまな読み取りメソッドや特殊なケースで非常にエラーが発生しやすいことがわかります。また、この車輪がすでに存在していて、再発明する必要がない場合もいいでしょう。

提案?

4

3 に答える 3

2

これが基本的な考え方です

class HexInputStream extends FilterInputStream {

    HexInputStream(InputStream in) {
        super(in);
    }

    @Override
    public int read(byte[] buff, int off, int len) throws IOException {
        int b = super.read();
        String hex = String.format("%02x", b);
        buff[0 + off] = (byte)hex.charAt(0);
        buff[1 + off] = (byte)hex.charAt(1);
        return 2;
    }
}

InputStream を作成します

InputStream is = new BufferedInputStream(new HexInputStream(new FileInputStream("1.test")));

そしてそれをコンポーネントに渡します。is.read では、常に 1 バイトを読み取り、それを 2 つの 16 進文字に変換します。

このアイデアを実際に機能させるには、ある程度の努力が必要です。

于 2013-03-21T12:13:46.320 に答える
1

これを実装するには、関連する読み取りメソッドや意図した他のメソッドを拡張FilterInputStream(またはFilterReader) してオーバーライドする必要があります。たとえば、read()メソッドは 1 バイトを読み取り、それを 2 つの 16 進バイトに変換し、最初のバイトを返し、次のread()呼び出しのために 2 番目のバイトを保持する必要があります。

于 2013-03-21T11:44:39.053 に答える
0

問題のユーティリティは Apache Commons IO によって提供されており、複雑な IO シナリオもカバーしようとしています。リンクはこちら

Apache Commons からの hexdump

お役に立てれば

于 2013-03-21T11:20:07.683 に答える