作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我们有一个需要读取十六进制数的 J2ME 应用程序。该应用程序对于某些手机来说已经太大了,因此我们尽量不包含任何其他编解码器或编写我们自己的函数来执行此操作。
所有数字都是十六进制的 64 位有符号整数,当我们使用 Long.ParseLong(hex, 16) 时,它可以正确处理正数,但对负数会抛出异常,
long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16);
我们如何使用 Java 本身提供的类从该十六进制字符串中获取 -1?
有些人可能会建议我们应该按照 Java 的预期将十六进制写为 -1。抱歉,格式由协议(protocol)固定,我们无法更改。
最佳答案
你的问题是parseLong()
不处理二进制补码 - 它期望符号以“-”的形式出现。
如果你正在为 CDC 配置文件开发,你可以简单地使用
long l = new BigInteger("FFFFFFFFFFFFFFFF", 16).longValue()
但是 CLDC 配置文件没有那个类。在那里,做你需要做的最简单的方法可能是把长的分开,把它分成两半,然后重新组合它们。这有效:
long msb = Long.parseLong("FFFFFFFF", 16);
long lsb = Long.parseLong("FFFFFFFF", 16);
long result = msb<<32 | lsb;
更新
从 Java 8 开始,您可以使用 parseUnsignedLong()
:
long l = Long.parseUnsignedLong("FFFFFFFFFFFFFFFF", 16);
关于java - 如何在 Java 中解析十六进制的负长整型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1410168/
我是一名优秀的程序员,十分优秀!