Javaではbyte配列からStringを生成できますが、そのときに注意しないとゴミが入ってしまうことがありました。
スポンサーリンク
目次
Stringに渡したbyte配列はすべて取り込まれる
例えば、UnitTestで次のコードを実行すると、
byte[] b = new byte[1024]; b[0] = 't'; b[1] = 'e'; b[2] = 's'; b[3] = 't'; b[4] = '1'; String str= new String(b); String str2 = "test1"; Assert.assertEquals(str, str2);
結果は失敗してしまいます。
junit.framework.ComparisonFailure: Expected :test1 Actual :test1
しかもどうして失敗しているかぱっと見わからない…
これは、Stringがbyte[1024]から作成されていて、データとしては1024文字分使われているからなのですね…
でもtest1以降は0x00で埋められているので、表に出てくるのは「test1」まで。なので後ろにゴミが入っていても見えないのです。わかりづらい…
必要な長さのbyte配列を用意するか必要な長さだけで生成する
解決方法は2つ。必要な長さぶんのbyte配列にするか、必要な長さで切るかです。
必要な長さぶんのbyte配列にする
要するに、データ分の長さでbyte配列を作るということです。
今回の場合だと、始めから
byte[] b = new byte[5]; b[0] = 't'; b[1] = 'e'; b[2] = 's'; b[3] = 't'; b[4] = '1';
というbyte配列であれば問題なかった。
また、配列bから生成したいというときは
byte[] b2 = new byte[5]; System.arraycopy(b, 0, b2, 0, 5); str = new String(b2);
とするなどして、長さ5に切り詰めた配列を用意してやれば、無事一致します。
使用するbyteの長さを指定する
または、Stringのコンストラクタで位置と長さを指定します。
str = new String(b, 0, 5);
とすると、配列bの位置0から5つぶんだけを使用してStringが作成されます。
実際にはこちらのほうが使用する機会が多いかもしれません。