49

バイト配列をスライスして、配列の最初の部分を削除しようとしています。ByteBuffer を使用していますが、期待どおりに動作しません。

byte[] myArray = new byte[10];
ByteBuffer buf = ByteBuffer.wrap(myArray);
buf.position(5);
ByteBuffer slicedBuf = buf.slice();
byte[] newArray = slicedBuf.array();

newArray のサイズは 5 で、ByteBuffer の最後の部分だけが含まれていると予想します。代わりに、完全なバイト配列が返されます。これは、「バッキングバッファー」がずっと同じであるためだと理解しています。

配列の必要な部分だけをスライスするにはどうすればよいですか?

編集:コンテキストを追加

バイトはネットワークから受信されます。バッファは次のように形成されます。

[ SHA1 hash ] [ data... lots of it ]

バイト配列をパラメーターとして取り、SHA1 ハッシュを計算する関数が既にあります。私が望むのは、完全なバッファをスライスして、予想されるハッシュなしでデータのみを渡すことです。

4

2 に答える 2

8

作成した は、そのByteBufferアレイによってサポートされています。呼び出すと、そのデータの特定のビューslice()を効果的に受け取ります。

コンテンツがこのバッファのコンテンツの共有サブシーケンスである新しいバイト バッファを作成します。

array()そのため、返されたものを呼び出すとByteBuffer、バッキング配列全体が返されます。

そのビューからすべてのバイトを抽出するには、次のようにします。

byte[] bytes = new byte[slicedBuf.remaining()];
slicedBuf.read(bytes);

そのビューからのバイトは、新しい配列にコピーされます。

以下のコメントから編集して追加します:バイトを 1byte[]から別のにコピーすることに興味がある場合は、 ;byte[]を使用する理由がないことに注意してください。ByteBuffer単純にバイトをコピーします。

于 2013-08-21T21:07:28.840 に答える