我需要从字节数组中获取无符号整数。我知道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功能的其他解决方案,但我无法让它做我想要的。
答案 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()
方法中看到这一点。