我正在尝试建立一个可靠的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。
答案 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
答案 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];
这只是一种方法。 (免责声明:未经测试。)