我们有一个需要读取十六进制数的J2ME应用程序。对于某些手机来说,应用程序已经太大了,所以我们尽量不要包含任何其他编解码器或编写我们自己的功能来执行此操作。
所有数字都是十六进制的64位有符号整数,当我们使用Long.ParseLong(十六进制,16)时,它正确处理正数,但它会在负数上抛出异常,
long l = Long.parseLong("FFFFFFFFFFFFFFFF", 16);
如何使用Java本身提供的类从该十六进制字符串中获取-1?
有些人可能会建议我们应该将我们的十六进制写为-1,就像Java预期的那样。抱歉,该格式由协议修复,我们无法更改。
答案 0 :(得分:21)
你的问题是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);
答案 1 :(得分:7)
将它解析成块。
long l = (Long.parseLong("FFFFFFFFF",16)<<32) | Long.parseLong("FFFFFFFF",16);
答案 2 :(得分:0)
更糟糕的情况是,您可以检查字符串是否是以8-F开头的16个字符,如果是,则将其更改为等效字符w / o最高有效位集(即从中减去8)数字),解析结果,并将解析后的值添加到有符号长整数的下限? (基本上只是自己做2的补码。)