0

定義したファイル タイプを表すために、ByteBuffer を介して byte[] にアクセスしようとしました。byte[] 内の最初の位置にはメタデータが含まれており、ビット操作で処理されます。したがって、それらは char をまったく表していません。

特定の固定位置にファイルデータ(文字など)を追加したい。

byte[] file_portion大きなファイルの一部、つまり最初のセクションが含まれています。これには、メタデータを含むヘッダーが含まれます。 contentそのバッファに追加したい情報を含む文字列です。start_pos は、コンテンツからの新しいファイル データを保持する最初の位置です。

ByteBuffer my_content = ByteBuffer.allocate(this.file_portion.length);
content_buffer.wrap(this.file_portion);

for (int i = 0; i < content.length(); i++) {
    char tmp = content.toCharArray()[i];
    my_content.put(this.start_pos + i, (byte) tmp)
}

これを再マップすると、ガベージと空が得られます。

CharBuffer debug = my_content.asCharBuffer();
System.out.println("debug " + debug);

最初の位置が破損した文字を示しているかどうかは理解できました...しかし、1つの位置が正しいわけではありません。

4

2 に答える 2

2

ByteBuffer に char を追加し、それらが CharBuffer ビューで読み取れることを期待している場合は、put(...) ではなく putChar(...) を使用する必要があります。

EDITED : OP コメントごと。

例えば:

char[] chars = content.toCharArray();  // removed from loop per leonbloy's excellent comment  
CharBuffer cbuf = my_content.asCharBuffer();

for (int i = 0; i < content.length(); i++) {
    cbuf.putChar(chars[i]);
}

CharBuffer debug = my_content.asCharBuffer();
System.out.println(debug);

my_content.position(my_content.position() + 2*chars.length);

それ以外の場合、CharBuffer は連続する 2 バイトを 1 つの文字として読み取っています。これで、cbuf バッファーは、バイト バッファーが中断したのと同じ時点で文字の読み込みを開始します。すべての文字をロードした後、元の ByteBuffer は次の場所に配置されます。うまくいけば、これはあなたが探しているものです。

于 2011-01-13T21:18:38.887 に答える
2

Java では、1 つの char が 2 バイトを占めることをご存知ですか?

于 2011-01-13T21:13:17.297 に答える