需要将一个由4个字节组成的数组转换为整数。

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

消息是被发送的“信息”

序列是数据包的序列号;第一个发送的数据包的序列号为0,下一个为1,以此类推

确认是返回已发送的数据包的确认

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

现在,当我接收到数据包时,我需要将其解包。 首先,我需要检查前4个字节(协议),以确定是否要忽略数据包,但我不知道如何将字节数组转换为int。


3
请访问https://dev59.com/UHI-5IYBdhLWcg3wR2Jr,该页面包含将整数转换为字节数组的Java代码示例。 - gtgaxiola
或者这个相关的示例 - trashgod
将字节数组转换为整型数组将字节数组转换为Java中的整数以及反之如何将字节数组转换为其数值形式(numeric value)的Java代码 - Alvin Pradeep
3个回答

2

您可以使用

ByteBuffer bb = ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN or BIG_ENDIAN);
bb.position(pos);
int n = bb.getInt();

0
byte array - > String -> Integer
  1. 字节数组 - 4个字节;
  2. 字符串 - new String(字节数组);
  3. 整数 - Integer.parseInt(字符串);

这假设一个整数的字符串编码与它在字节数组中存储的方式相同,这是不正确的。例如,new String(new byte[] {65})返回A - matt b

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

这只是其中一种方法。(再次声明:未经测试。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接