如何在 Java 中解析十六进制中的负长

2022-09-04 06:26:53

我们有一个需要读取十六进制数的 J2ME 应用程序。对于某些手机来说,该应用程序已经太大了,因此我们尽量不要包含任何其他编解码器或编写自己的函数来执行此操作。

所有数字都是十六进制中的64位有符号整数,当我们使用Long.ParseLong(十六进制,16)时,它正确处理正数,但它会在负数上抛出异常,

    long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16);

我们如何使用Java本身提供的类从该十六进制字符串中获得-1?

有些人可能会建议我们应该像Java预期的那样将十六进制写为-1。抱歉,格式由协议固定,我们无法更改它。


答案 1

你的问题是 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);

答案 2

以块的形式解析它。

    long l = (Long.parseLong("FFFFFFFFF",16)<<32) | Long.parseLong("FFFFFFFF",16);