- PR -

バイトシーケンスの操作

1
投稿者投稿内容
しん
常連さん
会議室デビュー日: 2004/04/04
投稿数: 48
投稿日時: 2007-01-19 01:27
http://itpro.nikkeibp.co.jp/article/COLUMN/20060417/235453/
上記ページを参照してByteBufferクラスのpositionやlimitを使って指定した
バイト数だけ文字列を取得できるのではないかと思い下記のようにコードを書いてみました。
文字列「cd」だけ抜き出そうと思ったのですが(substring使えばという突っ込みは
抜きにして・・・)下記やり方では
「abcdef」の全部が取れてしまいました。やり方がまずいのでしょうか?


public class test1 {
  public static void main(String args[]) {
     byte[] x = "abcdef".getBytes();
ByteBuffer buffer = ByteBuffer.wrap(x);

buffer.position(2);
buffer.limit(3);
System.out.println(new String(buffer.array()));
  }
}
お犬様
ベテラン
会議室デビュー日: 2003/01/26
投稿数: 67
投稿日時: 2007-01-19 01:43
この場合、buffer.array() は ByteBuffer.wrap(byte[]) で引数に渡された配列そのものを返します。

> 「abcdef」の全部が取れてしまいました。
それが文書通りの挙動だと思われます。
しん
常連さん
会議室デビュー日: 2004/04/04
投稿数: 48
投稿日時: 2007-01-21 19:32
返答ありがとうございます。
バイト文字列の任意の場所を切り出す方法を試したく思い下記のように
試してみました。
ByteBufferクラスのgetメソッドのリファレンスを見ると
「このメソッドは、このバッファの現在位置から length バイトを指定された
配列の指定されたオフセット位置へコピーします。」とあるので
position()メソッドでオフセットを2バイト目に設定したあと
getメソッドにてy配列にオフセット位置である2バイト目から2バイト分切り出して
y配列に格納しようとしました。

その結果表示された結果は
予想:"bc"に対して
結果:"/"
"/a"
"/ab"
と表示されました。
うまく切り出すにはどうすればよいでしょうか。

コード:
public class test1 { 
  public static void main(String args[]) { 
     byte[] x = "abcdef".getBytes();
          byte[] y = new byte[2];
 
     ByteBuffer buffer = ByteBuffer.wrap(x); 

     buffer.position(2); 
     buffer.get(y,2,2); 
     System.out.println(new String(y)); 
  } 
} 

お犬様
ベテラン
会議室デビュー日: 2003/01/26
投稿数: 67
投稿日時: 2007-01-21 20:16
提示されているコードでは IndexOutOfBoundsException が投げられるはずなんですが……

> buffer.get(y,2,2);
この呼び出しですが、
引用:
dst - バイトの書き込み先となる配列
offset - 最初のバイトの書き込み先となる配列内のオフセット。0 以上かつ dst.length 以下の正の数でなければならない
length - 指定された配列に書き込まれる最大バイト数。0 以上かつ dst.length - offset 以下の正の数でなければならない

の 最後の条件、length が 0以上、 dst.length(2) - offset(2) 以下(要するに 0以下)の正の数でなければならない、を満たしません。

> うまく切り出すにはどうすればよいでしょうか。
とりあえず、落ち着いてドキュメントを きちんと読んでみてはいかがでしょう。
1

スキルアップ/キャリアアップ(JOB@IT)