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

ZZ *_*der 11 java hex

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

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

    long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16);
Run Code Online (Sandbox Code Playgroud)

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

有些人可能会建议我们应该将我们的十六进制写为-1,就像Java预期的那样 对不起,格式由协议修复,我们无法更改.

Mic*_*rdt 21

你的问题是parseLong()不能处理两个补码 - 它希望符号以' - '的形式出现.

如果您正在为CDC配置文件进行开发,则可以简单地使用

long l = new BigInteger("FFFFFFFFFFFFFFFF", 16).longValue()
Run Code Online (Sandbox Code Playgroud)

但CLDC配置文件没有该类.在那里,最简单的方法来做你需要的可能是分裂长,将它解析成两半并重新组合它们.这有效:

long msb = Long.parseLong("FFFFFFFF", 16);
long lsb = Long.parseLong("FFFFFFFF", 16);
long result = msb<<32 | lsb;
Run Code Online (Sandbox Code Playgroud)

UPDATE

从Java 8开始,您可以使用parseUnsignedLong():

long l = Long.parseUnsignedLong("FFFFFFFFFFFFFFFF", 16);
Run Code Online (Sandbox Code Playgroud)


Bil*_*ain 7

把它解析成块.

    long l = (Long.parseLong("FFFFFFFFF",16)<<32) | Long.parseLong("FFFFFFFF",16);
Run Code Online (Sandbox Code Playgroud)