java - 如何将存储为小端字节数组的 uint16 转换为 int?

标签 java arrays type-conversion integer unsigned-integer

我收到一些数据,它们是表示 uint16 的小端字节数组,但我想将其存储在 int 中。我已将此数据包装到 ByteBuffer 中,因此我可以调用 ByteBuffer.get() 来获取下一个字节,但我不确定如何转换这 2 个字节从 uint16 到 int 的字节。

    byte[] data = //From UDP socket
    ByteBuffer bb = ByteBuffer.wrap(data);
    bb = bb.order(ByteOrder.LITTLE_ENDIAN);
    while(bb.hasRemaining()){
        int n = //What goes here?
    }

感谢您的帮助:)

最佳答案

我认为主要的复杂性是如何在 Java 中表示 uint16。我建议使用 Java int 或 Java long,因为至少 16 位与 uint16 中的含义相同(但不是 Java < em>short:它有 16 位,但有符号)。

1) 如果您仅收到 uint16,没有字符,没有其他类型,那么最简单的方法如下。将 16 位读入 Java short,然后将其转换为 int:

byte[] data = //From UDP socket
ByteBuffer bb = ByteBuffer.wrap(data);
bb = bb.order(ByteOrder.LITTLE_ENDIAN);

while(bb.hasRemaining()){
    short s = bb.getShort();
    int n = 0xFFFF & s;
    ...
}

2) 如果您不仅收到 uint16,还收到一些其他类型(例如字符),那么您可以从 2 个字节构造值:

byte[] data = //From UDP socket
ByteBuffer bb = ByteBuffer.wrap(data);

while(bb.hasRemaining()) {
    if (consider next bytes as uint16) {
        byte b1 = bb.get();
        byte b2 = bb.get();
        int i1 = 0xFF & b1; // Consider b1 as int, not the same as "(int) b1"
        int i2 = 0xFF & b2; // Consider b2 as int, not the same as "(int) b2"
        int n = b2 * 256 + b1;
        ...
    } else {
        // Read next bytes as char or something other
    }
}

关于java - 如何将存储为小端字节数组的 uint16 转换为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59556097/

相关文章:

java - 想要将 long(以 TB 为单位的巨大文件大小)除以某个数字(巨大的 int)并安全地获得一个 int

C++ 隐式类型转换

Java泛型(简单案例,推理清晰)

java - 使用java在幻灯片中创建段落项目符号

java - Web Socket 和非阻塞模式

python - 使用 2d 数组对 3d numpy 数组进行索引

java - Kryonet 在多次发送自定义对象后断开连接

arrays - Julia 反转 N 维数组

c# - 合并2个数组,保持有序,求效率

c++ - 为什么表达式 (int) +1e10 不会产生 -2147483648 正如 CSAPP 所描述的那样?