2011-01-13 10 views
0

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

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

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つの位置は正しいです。

+2

バグに加えて、 'content.toCharArray()[i]'は醜いので、各ループ反復で新しいchar配列を割り当てています。 char配列を外側に構築するか、 'content.charAt(i)'を使用します。 – leonbloy

答えて

2

ByteBufferに文字を追加し、それらを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のは、単一のcharとしてあなたの連続したバイトの2を読んでいます。 これで、cbufバッファは、バイトバッファが残っている同じ位置で文字のロードを開始します。すべての文字をロードした後、元のByteBufferは次の位置に配置されます。うまくいけば、これはあなたが探しているものです。

+0

.flip()は非常に便利です。しかし、私はまだ特定の位置に文字を追加する必要があります。私がmy_content.setPosition(this.start_pos + i)または+ i + 1でそれを行うと、変換全体が壊れてしまいます。 – wishi

+1

私が作ろうとしているのは、Buffersにあなたの人生を楽にさせるために2つのことをさせる必要があるということです。 1)バッファ内の位置を管理し、2)読み書きされる項目のデータ形式を管理する。元のコードでは、両方を実行しようとしており、そのために問題が発生しています。 –

+0

あなたの努力に感謝します。あなたは絶対に正しいです:ポジションを管理することはここで問題であり、私はこれを分けなければなりません。それでも私はcbufが位置0から満たされているという問題を抱えています。位置nから開始してそれを埋める必要があります。私がこれをするたびに、すべてのものが壊れてしまいます。 : – wishi

1

Javaでは、charは2バイトを占有していますか?

関連する問題