JavaでStringをbyte配列から生成するときにゴミが入ってしまうときの対応

ヨメレバCSS
オリジナルCSS

 Javaではbyte配列からStringを生成できますが、そのときに注意しないとゴミが入ってしまうことがありました。

スポンサーリンク
GoogleAdSence レクタングル(大)

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が作成されます。

 実際にはこちらのほうが使用する機会が多いかもしれません。

スポンサーリンク
GoogleAdSence レクタングル(大)

シェアする

スポンサーリンク
GoogleAdSence レクタングル(大)