3

信頼性の高い UDP システムを作成しようとしていますが、byte[] を int に変換する必要があります (JCreator 5.0 LE)

DatagramPacket は byte[] 形式のデータを必要とするため、送信できるように int 情報を byte[] に変換する必要があります。

byte[] data = new byte[48];

System.arraycopy(task.getProtocol().byteValue(), 0, data, 0, task.getProtocol().byteValue().length);
System.arraycopy(task.getMessage().byteValue(), 0, data, 4, task.getMessage().byteValue().length);
System.arraycopy(task.getSequence().byteValue(), 0, data, 8, task.getSequence().byteValue().length);
System.arraycopy(task.getAcknowledge().byteValue(), 0, data, 12, task.getAcknowledge().byteValue().length);

for (int i = task.getAcknowledge(); i >= 0 && i > task.getAcknowledge() - 33; i--) {

    for (Packet j: tasks) {

        if (j.getSequence() == i) {

            data[i] = 1;
            break;

        }

    }

}

out = new DatagramPacket(data, data.length, ds.getInetAddress(), portNum);
ds.send(out);

プロトコルはプロトコルIDです

メッセージは送られてくる「情報」

Sequence はパケットのシーケンス番号です。最初に送信されたパケットのシーケンスは 0、次のパケットは 1 などです。

Acknowledge は、パケットが送り返されたことの確認です。

次の部分は、その他の 32 の承認です。メモリを節約するために、4 バイト (int) ではなく、それぞれ 1 バイトに圧縮されます。

さて、パケットを受け取ったら、それを開梱する必要があります。最初に最初の 4 バイト (プロトコル) をチェックして、パケットを無視するかどうかを確認する必要がありますが、バイト配列を int に変換する方法がわかりません。

4

3 に答える 3

2

使用できます

ByteBuffer bb = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN or BIG_ENDIAN);
bb.position(pos);
int n = bb.getInt();
于 2012-09-17T19:04:21.793 に答える
0
byte array - > String -> Integer
  1. バイト配列 - 4 バイト。
  2. 文字列 - 新しい文字列 (バイト配列);
  3. 整数 - Integer.parseInt(String);
于 2012-09-17T18:16:25.260 に答える
0

一般的な方法は次のとおりです。それは 32 ビット ビッグ エンディアン (通常の「ネットワーク順序」) であり、配列内の位置「pos」から始まります。

int out = 0;
out += 0xFF & data[pos++];
out <<= 8;
out += 0xFF & data[pos++];
out <<= 8;
out += 0xFF & data[pos++];
out <<= 8;
out += 0xFF & data[pos++];

ただし、これは整数に使用されるバイト数に適合させることができます。「out」を返し、呼び出すメソッドを作成します。署名によるバグに注意してください。「0xFF &」はそれらを避けるためにあります。また、<<= が正しいかどうかもわかりません。

それらがリトルエンディアンの場合、少し難しくなります。

int out = 0;
pos += 4;
out += 0xFF & data[--pos];
out <<= 8;
out += 0xFF & data[--pos];
out <<= 8;
out += 0xFF & data[--pos];
out <<= 8;
out += 0xFF & data[--pos];

これらは、そのための 1 つの方法にすぎません。(再度免責事項: 未テスト。)

于 2012-09-17T18:24:57.727 に答える