当前位置: 首页 > 面试题库 >

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

缪晋
2023-03-14
问题内容

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

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

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

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

有人可能建议我们应该像Java期望的那样将十六进制写为-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);


 类似资料:
  • 我在调试一个ANTLR语法时遇到了问题,我正在为Gameboy程序集工作。它似乎工作正常,但由于某些原因,它不能在某些边缘情况下处理十六进制的0x表示法。 如果我的输入字符串是“JR0x10”,antlr将失败,并出现'No Valide alternative at input‘错误。按照我的理解,这意味着我要么没有解析令牌流的规则,要么没有正确理解'0x'。如果我使用“JR$10”(我支持的替

  • 我从下面的另一个问题中看到了一个代码,但我不知道如何利用它。

  • 问题内容: 我使用python 2.6 正值和负值相同吗? 当我使用calc时,值为。 问题答案: Python的整数可以任意增大。为了按您希望的方式计算原始二进制补码,您需要指定所需的位宽。您的示例以64位二进制补码显示,但也可能是32位或128位,因此开始时会产生不同数量的。 不这样做。我建议以下方法: 打印输出:

  • 问题内容: 如何在JavaScript中将十进制值转换为等效的十六进制值? 问题答案: 使用以下命令将数字转换为十六进制字符串: 并通过以下步骤逆向处理:

  • 问题内容: 我有一些Perl代码,其中hex()函数将十六进制数据转换为十进制。如何在Python上执行此操作? 问题答案: 如果用“十六进制数据”表示字符串形式 您可以使用 将其转换为整数并 将其转换为十进制字符串。

  • 问题内容: 我要提取长十六进制字符串形式的数据,我需要将其转换为十进制表示法,截断18个小数位,然后在JSON中使用。 例如,我可能具有十六进制字符串: 最初我尝试使用,但是由于它支持的最高级别,我的数量最终太大了。 转换和截断后的示例为10 ^ 6。但是,在某些情况下,此数字最多可以为10 ^ 12(意味着截断为10 ^ 30!)。 攻击此问题的最佳策略是什么? 问题答案: 使用math / b