java - 如何在 Java 中处理无符号短裤/整数/长裤

标签 java groovy

我正在读取一种文件格式,它指定某些类型是无符号整数和短整型。当我读取这些值时,我将它们作为字节数组获取。我见过的将它们变成空头/整数/多头的最佳途径是这样的:

ByteBuffer wrapped = ByteBuffer.wrap(byteArray);
int x = wrapped.getInt();

对于无符号整数,它看起来很容易溢出。有没有更好的方法来处理这种情况?

更新:我应该提到我正在使用 Groovy,所以我绝对不关心是否必须使用 BigInteger 或类似的东西。我只想在保持值(value)不变方面获得最大的安全性。

最佳答案

32 位值,有符号或无符号,总是可以无损地存储在 int* 中。这意味着从数据安全的角度来看,您永远不必担心将无符号值放入有符号类型中。

对于 byte 中的 8 位值、short 中的 16 位值和 long 中的 64 位值也是如此。

将无符号值读入相应的有符号类型后,您可以将它们提升为更大类型的有符号值,以便更轻松地处理预期值:

因为没有比 long 大的原始类型,您可以通过 BigInteger,或者使用 Long 上的便捷方法来执行无符号操作:


* 这要归功于 JVM 需要 integer types to be two's complement .

关于java - 如何在 Java 中处理无符号短裤/整数/长裤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48834870/

相关文章:

java - java字节码不是顺序执行的吗?

grails - 使用大于和小于操作数的$ gt查找在GMongo中不起作用的方法

intellij-idea - 通过具有委托(delegate)闭包参数的 GDSL 脚本创建方法

java - 如何在struts2.xml文件中声明Generics Action?

grails - 简单的grails rc1集成测试失败

Jenkinsfile ${steps.env.BUILD_NUMBER} : bad substitution

groovy - XmlSlurper.parse(uri) 带有 HTTP 基本身份验证

java - 实用程序将字节数组中的位提取到新的字节[]中

java - 对于具有 JoinColumn 的 ManyToOne,Envers 正在审核错误的列

java - BigDecimal 错误舍入