Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中从字节数组获取无符号整数_Java_Unsigned - Fatal编程技术网

在java中从字节数组获取无符号整数

在java中从字节数组获取无符号整数,java,unsigned,Java,Unsigned,我需要从字节数组中获取无符号整数。我知道java不支持无符号原语,我必须使用较高的原语(long)来获得无符号int。许多人通常建议这样的解决方案: public static long getUnsignedInt(byte[] data) { ByteBuffer bb = ByteBuffer.wrap(data); bb.order(ByteOrder.LITTLE_ENDIAN); return bb.getInt() & 0xffffffffl; }

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

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

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

您可以这样做:

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;
}
public静态长getUnsignedInt(字节[]数据){
长结果=0;
对于(int i=0;i

没有“溢出异常”这样的事情。您的解决方案将始终正确有效地工作。别担心。

我无法让它做我想要的事情。您能澄清一下您想要什么吗?@SotiriosDelimanolis我相信OP正在寻找另一种方法(使用BigInteger)从字节[]生成无符号整数看看这个答案:你有4个字节。你不能直接跳到一个
长的
。你需要先得到
int
。你确定你的输入字节是以小尾端字节顺序排列的吗?除此之外,我认为问题中的代码比你接受的代码好…这显然是正确的答案。然而,我认为可能它应该是一个注释,问题结束了,因为它似乎完全基于一个误解。如果最后一个字节大于128,这可能会得到一个否定的结果或错误的结果。@Eki考虑到Java中的int是32位长的,我们返回一个长的(64位)这不会发生,除非您尝试构建一个包含8个字节的int,这是无意义的。不,我使用一个4字节数组作为输入,只有最后一个字节的值大于128,并且得到负输出。我认为原因是当您执行“result+=somebyte”时,java会隐式地将somebyte转换为long类型,所以实际上结果将加上由somebyte转换的负long值。嗯,您是对的,对于无符号字节,这无关紧要(C等)。请尝试按位或。