如何在Java中解析hex的否定长

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

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

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

如何使用Java本身提供的类从该hex字符串中获取-1?

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

你的问题是parseLong()不处理两个补码 – 它希望符号以’ – ‘的forms出现。

如果您正在为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; 

UPDATE

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

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

把它解析成块。

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

更糟糕的情况是,您可以检查字符串是否是以8-F开头的16个字符,如果是,则将其更改为等效字符w / o最高有效位集(即从该数字中减去8),解析结果,并将解析后的值添加到有符号长整数的下限? (基本上只是自己做2的补码。)