【问题标题】:Need to convert an array of 4 bytes into an int需要将一个4字节的数组转换成一个int
【发布时间】:2012-09-10 00:01:26
【问题描述】:

我正在尝试制作一个可靠的 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

Message 是正在发送的“信息”

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

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

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

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

【问题讨论】:

标签: java int bytearray type-conversion


【解决方案1】:

你可以使用

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

【讨论】:

    【解决方案2】:
    byte array - > String -> Integer
    
    1. 字节数组 - 4 个字节;
    2. 字符串 - 新字符串(字节数组);
    3. 整数 - Integer.parseInt(String);

    【讨论】:

    • 这假定整数的字符串编码与它在字节数组中的存储方式相同——这是不正确的。例如,new String(new byte[] {65}) 返回A
    【解决方案3】:

    嗯,这是一个通用的方法;它是一个 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];
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-19
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2011-09-16
      • 2023-01-13
      • 2019-10-18
      相关资源
      最近更新 更多