2

背景: ソケットを介して非常に限られた範囲で情報を渡す割り当てがあります。メッセージごとに最大 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 バイトのデータに過ぎず、それ以上のものではないことを信頼できるかどうか疑問に思っています... 混乱しています :(

前もって感謝します!

4

3 に答える 3

5
  1. はい。Byte ラッパーでは、たとえば、null 許容バイトを表現したり、バイト値をコレクションやマップに格納したりすることもできます。

  2. テキストを DataInputStream に送信すると、このテキストはプラットフォームのデフォルトのエンコーディングを使用してバイトにエンコードされます。それがASCIIであると仮定すると、最初の文字はバイトにエンコードされてから\r送信\nされ、これもASCIIを使用してエンコードされます。したがって、読み取った 3 バイトは、 char + の ASCII エンコードされた値です\r\n

  3. javadocは何をするかを説明InputStream.read()します。1バイトを読み取り、バイト -1 と「ストリームの終わり」を意味する -1 を区別するために、0 から 255 の間の int に変換します。返された int からバイトを取得するには、-1 (ストリームの終わりを意味する) でないことを確認し、バイトにキャストします。byte b = (byte) readValue;

于 2012-12-02T17:36:12.053 に答える
0

あなたの場合、オブジェクト Byte にラップする必要はありません。コレクションを操作するときは、主に Byte が必要です。

DataOutPutStream は問題ありません。メソッドを使用してくださいwrite(int b)

byte b = (byte) 0x03;
DataOutPutStream dos;
// ....
dos.write(b);
于 2012-12-02T17:37:10.310 に答える
-1

違いは、あなたが言ったように、Byte は byte のラッパー クラスであることです。プリミティブであるため、どの変数にも代入byteできません。対照的に、はオブジェクトなので、割り当てることができます。nullbyteBytenull

そう:

byte primitiveByte = null; // Compiler error
Byte objectByte = null; // works

Vulcan が言ったように、Byte は byte に自動ボックス化されます。つまり、JVM が Byte オブジェクトの代わりに byte を使用できると判断した場合、出現箇所を byte プリミティブに置き換えます。

于 2012-12-02T17:35:23.787 に答える