2017-11-25 11 views
0

ByteArrayOutputStreamを使用してバイト配列を埋めました。私がそれを印刷すると、出力が混乱します。私はいくつかの指導が必要です。ここでbytearrayoutputstreamからのバイト配列の印刷

は私のコードです:ここでは

ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
    DataOutputStream out = new DataOutputStream(bout); 
    try { 
     out.writeInt(150); 
     byte[] b = bout.toByteArray(); 
     System.out.println(Arrays.toString(b)); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

は私の出力です:

[0, 0, 0, -106] 

答えて

0

150は、バイトのビット-128(の用語である1001 0110 に等しい助けてください最も左のビット)プラス2 + 4 + 16 = -106

0

int 150〜outと記載してください。 (具体的には、two's complement)バイナリでは、この整数は次のようになります

0000 0000 0000 0000 0000 0000 1001 0110 

8ビットの各グループはbyteデータ型に類似した1バイトのデータです。しかし、すべてのJavaの整数型(charを除く)と同様に、byteが署名されています。したがって、最後のbyteは、1001 0110のバイナリ値を持ちますが、-106と表示されます。これは、2の補数でのそのバイトの正しい値です。印刷文を次のように置き換えることができます。

String[] strings = new String[b.length]; 
for (int i = 0; i < b.length; i++) { 
    strings[i] = Integer.toString(Byte.toUnsignedInt(b[i])); 
} 
System.out.println("[" + String.join(", ", strings) + "]"); 

バイトを符号なし形式で出力します。それぞれが[0、255]の範囲にあるでしょう。