我正在读取一种文件格式,它指定某些类型是无符号整数和短整型。当我读取这些值时,我将它们作为字节数组获取。我见过的将它们变成空头/整数/多头的最佳途径是这样的:
ByteBuffer wrapped = ByteBuffer.wrap(byteArray);
int x = wrapped.getInt();
对于无符号整数,它看起来很容易溢出。有没有更好的方法来处理这种情况?
更新:我应该提到我正在使用 Groovy,所以我绝对不关心是否必须使用 BigInteger
或类似的东西。我只想在保持值(value)不变方面获得最大的安全性。
最佳答案
32 位值,有符号或无符号,总是可以无损地存储在 int
* 中。这意味着从数据安全的角度来看,您永远不必担心将无符号值放入有符号类型中。
对于 byte
中的 8 位值、short
中的 16 位值和 long
中的 64 位值也是如此。
将无符号值读入相应的有符号类型后,您可以将它们提升为更大类型的有符号值,以便更轻松地处理预期值:
因为没有比 long
大的原始类型,您可以通过 BigInteger,或者使用 Long
上的便捷方法来执行无符号操作:
- BigInteger.valueOf( Long.toUnsignedString(long) )
- Long.divideUnsigned(long,long)和 friend
* 这要归功于 JVM 需要 integer types to be two's complement .
关于java - 如何在 Java 中处理无符号短裤/整数/长裤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834870/