需要将4个字节的数组转换为int

时间:2012-09-17 18:08:54

标签: java int bytearray type-conversion

我正在尝试建立一个可靠的UDP系统,我需要将byte []转换为int和back(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);

协议是protocolID

消息是正在发送的“信息”

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

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

下一部分是另外32个致谢。为了节省内存,它们被压缩为每个1个字节而不是4个字节(int)

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

3 个答案:

答案 0 :(得分:2)

您可以使用

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

答案 1 :(得分:0)

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

答案 2 :(得分: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++];

但是这可以适应整数使用的字节数。我会打电话给'退出'。留意因签名而产生的错误。 “0xFF&amp;”是为了避免这些。另外,不确定我得到&lt;&lt; =对不对劲。

如果他们是小端,那就更难了:

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

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