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,依此类推

确认是对发送回的数据包的确认

下一部分是其他 32 个确认。为了节省内存,它们被压缩为每个 1 个字节而不是 4 个字节(int)

现在,当我收到数据包时,我需要将其拆包。首先我需要检查前 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 位 Big-Endian(通常的“网络顺序”),从数组中的“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 &”是为了避免这些。另外,不确定我的 <<= 事情是否正确。

如果它们是 little-endian,那就更难了:

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];

这些只是一种方法。(再次免责声明:未经测试。)

于 2012-09-17T18:24:57.727 回答