【问题标题】:Get unsigned integer from byte array in java从java中的字节数组获取无符号整数
【发布时间】:2015-07-31 15:43:27
【问题描述】:

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

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

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

【问题讨论】:

  • 我不能让它做我想做的事你能澄清你想要什么吗?
  • @SotiriosDelimanolis 我相信 OP 正在寻找另一种方法(使用 BigInteger)从字节 [] 生成无符号整数
  • 你有 4 个字节。您不能直接跳到long。您需要先获取int
  • 你确定你的输入字节是小端字节序吗?除此之外,我认为问题中的代码比您接受的代码要好...

标签: java unsigned


【解决方案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;
}

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

【讨论】:

  • 如果最后一个字节大于128,这可能会得到否定结果或错误结果。
  • @Eki 考虑到 Java 中的 int 长度为 32 位,我们返回一个 long(64 位),除非您尝试构建一个 8 字节的 int,否则不会发生这种情况,这是无意义的。跨度>
  • 不,我使用 4 字节数组作为输入,只有最后一个字节的值大于 128 并且得到负输出。我认为原因是当您执行“result += somebyte”时,java 会隐式将 somebyte 转换为 long 类型,因此实际结果会加上由 somebyte 转换的负 long 值。
  • 嗯,你是对的,无符号字节没关系(C等)。尝试按位或。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 2011-12-07
  • 2013-10-10
  • 2012-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多