从java

时间:2015-07-31 15:43:27

标签: java unsigned

我需要从字节数组中获取无符号整数。我知道java不支持无符号原语,我必须使用更高的原语(long)来获得unsigned int。许多人通常会建议解决方案:

public static long getUnsignedInt(byte[] data)
{
    ByteBuffer bb = ByteBuffer.wrap(data);
    bb.order(ByteOrder.LITTLE_ENDIAN);
    return bb.getInt() & 0xffffffffl;
}

但这不聪明,因为我们必须得到有符号整数然后将其转换为无符号,这当然可能导致溢出异常。我看到了使用BigInteger或新的java 8 unsigned功能的其他解决方案,但我无法让它做我想要的。

2 个答案:

答案 0 :(得分:3)

  

但这不聪明,因为我们必须得到有符号整数然后将其转换为无符号,这当然可能导致溢出异常。

没有"溢出异常。"您的解决方案将始终正确有效地工作。别担心了。

答案 1 :(得分:2)

你可以这样做:

public static long getUnsignedInt(byte[] data) {
    long result = 0;

    for (int i = 0; i < data.length; i++) {
        result += data[i] << 8 * (data.length - 1 - i);
    }
    return result;
}

你基本上创建一个空长并将字节移入它。 您可以在java.io.DataInputStream.readInt()方法中看到这一点。