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

如何在Java中解析十六进制中的负长,java,hex,Java,Hex,我们有一个需要读取十六进制数的J2ME应用程序。应用程序对于某些手机来说已经太大了,所以我们尽量不包含任何其他编解码器或编写我们自己的函数来实现这一点 所有数字都是十六进制的64位有符号整数,当我们使用Long.ParseLong(十六进制)时,它正确处理正数,但对负数抛出异常 long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16); 如何使用Java本身提供的类从十六进制字符串中获得-1 有些人可能会建议我们应该像Java所期望的那样将十六进制

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

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

    long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16);
如何使用Java本身提供的类从十六进制字符串中获得-1


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

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

你的问题是不处理2的补码-它希望符号以“-”的形式出现

如果您正在为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;
分块解析它

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

long l=(long.parseLong(“fffffffffff”,16)不完全正确。第一个字符可以来自8-F-这些都是负数。两个负数的补码也可以以E、D、C、B、A、9或8开头
    long l = (Long.parseLong("FFFFFFFFF",16)<<32) | Long.parseLong("FFFFFFFF",16);