背景: ソケットを介して非常に限られた範囲で情報を渡す割り当てがあります。メッセージごとに最大 10 バイトになる可能性があり、送信するのは 1 バイトだけだと考えていました (プロトコルで 256 の異なる状態を通知するには 1 バイトで十分なので)。今、私はこれに関する情報を探して掘り下げ始め、多くの質問に出くわしました. 私の仮定が間違っているところを修正し、可能であれば文字通りの質問に答えてください.
つまり、プリミティブ データ型のバイトがあります (これは基本的に -128 から 127 までの数値ですよね?)。私が使用する場合
byte b = 125;
System.out.println(b);
...コンソールに正しい数値が出力されますが、制限外の値を割り当てようとすると、コンパイラーが文句を言います。
次に、Byte データ型 (または API で言うように int) から明らかに Byte オブジェクトを作成するクラス Byte があります。
Byte b = new Byte(20);
System.out.println(b);
これも期待どおりの結果を生成し、コンソールに 20 が出力されます。127 よりも大きい数値を使用しようとすると、コンパイラからエラーが発生します。
1. データ型 byte とクラス Byte の違いは何ですか? クラス Integer が型 int に対して行うように、クラスが多くのメソッドを提供することが主な理由ですか?
次のスニペットは、奇妙な結果を生成します (私にとって):
import java.io.*;
public class ByteTest {
public static void main(String[] args) {
DataInputStream in = new DataInputStream(System.in);
try {
byte d;
while((d = in.readByte()) != 0) {
System.out.println(d);
}
}
catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
}
2. 入力が読み取られ、入力が 10 進数形式の ASCII 文字 (たとえば、1 は 49 を返す) として解釈され、その後に数字 13 と 10 の 2 つの行が続きます。これはなぜですか?
(d をバイトとして宣言するかバイトとして宣言するかは関係ありません。結果は同じであり、代わりにバイト b から値を取得するなどと混ぜましたが、これらの 3 行 (またはそれ以上) は常に結果です。そして私が欲しいのは、私に戻ってくる入力だけです)
基本的に私はこれに少し混乱していますが、最終的には、これらの単一バイトを送信するための合理的な方法が必要であり、34 を送信するときに、反対側に 34 を受信させたいだけです。
3. クラス Byte の使用を控え、ストリームを介してバイト型を送信したいとします。すべての通常のストリームとリーダーは int 以外のものを読み取っていないようです (これは、少なくとも 2 バイトの入力があるまでブロックすることを意味すると思いますが、1 つだけを送信します)。強制的に使用する必要がDataInputStream
あり DataOutputStream
、型バイトをオブジェクト Byte にラップする必要がある場所、または他の方法がありますか?
これらすべてのことから、オブジェクト Byte が実際には 1 バイトのデータに過ぎず、それ以上のものではないことを信頼できるかどうか疑問に思っています... 混乱しています :(
前もって感謝します!