如何在Java中将十六进制字符串转换为长整型?

55

我想在Java中将十六进制字符串转换为长整型。

我尝试过一般的转换方法。

String s = "4d0d08ada45f9dde1e99cad9";
long l = Long.valueOf(s).longValue();
System.out.println(l);
String ls = Long.toString(l);

但我收到了这个错误信息:

java.lang.NumberFormatException: For input string: "4d0d08ada45f9dde1e99cad9"

有没有办法在Java中将字符串转换为长整型?或者我正在尝试一些不可能的事情!

谢谢!


2
在调用valueOf之前,尝试将字符串添加“0x”前缀。 - sinelaw
3
你是否查看了Java文档?节省时间并始终首先查看Java文档。 - Stephen C
2
另外,valueOf应该接受第二个参数来指定基数。尝试传递16(以及没有前缀的字符串)。 - sinelaw
3
@sinelaw - 我认为你混淆了 Long.valueOf(String)Long.decode(String)valueOf(String) 的 Javadoc 说:“将字符串参数解析为有符号十进制长整型。” - Stephen C
Stephen,没错,是decode函数接受前缀。但是valueOf函数接受基数参数(请参见上面的链接)。 - sinelaw
4个回答

100

Long.decode(str) 方法接受多种格式的参数:

这个方法支持以下语法的十进制、十六进制和八进制数字:
DecodableString:

  • Signopt DecimalNumeral
  • Signopt 0x HexDigits
  • Signopt 0X HexDigits
  • Signopt # HexDigits
  • Signopt 0 OctalDigits

Sign:

  • -

但在你的情况下这并不能解决问题,因为你的字符串超出了 long 的范围。你需要使用 BigInteger 类来处理。

String s = "4d0d08ada45f9dde1e99cad9";
BigInteger bi = new BigInteger(s, 16);
System.out.println(bi);

输出:

23846102773961507302322850521

为了比较,这里是Long.MAX_VALUE

9223372036854775807


不确定System.out.println方法的签名,但是在一个字符串赋值中我需要使用bi.toString()。 - J E Carter II
2
@JECarterII 在一个对象上调用println会调用该对象的toString()方法。 - Sean Patrick Floyd
清晰明了。谢谢! - ashdnik
通过打印堆栈跟踪,似乎 Long.decode() 只是调用了 Long.parseLong() - PLG
@PLG 是围绕 Long.valueOf 的一个外观,而 Long.valueOf 又使用了 Long.parseLongLong.decode 的特定目的是检测输入字符串是十进制、八进制还是十六进制,然后使用检测到的基数调用 Long.valueOf - Sean Patrick Floyd

47

使用parseLong:

Long.parseLong(s, 16)

4
一般来说是正确的,但在这种情况下不适用(数字太大了Long类型无法处理)。 - Sean Patrick Floyd
仍然抛出NumberFormatException,太长了。 - Dead Programmer
@Suresh:是的,你的样本字符串无法转换为长整型,我只是回答“如何将十六进制字符串转换为长整型”。你可能需要看一下Sean Patrick Floyd提到的BigInteger。 - Erik
1
目标是转换为Long类型,对吧?那么这是一种干净简单的方法来实现它! - LCoelho
@SeanPatrickFloyd 这是原帖作者的问题,与本回答无关。 - user207421
如果字符串无法转换为Long类型,它应该失败并抛出异常。处理该异常是开发人员的职责。 - JonSlowCN

15
new BigInteger(string, 16).longValue()

对于任何一个someLong的值:

new BigInteger(Long.toHexString(someLong), 16).longValue() == someLong
换句话说,这将返回您传递给Long.toHexString()的任何long值,包括负数。它还将接受大于long的字符串,并将字符串的最低64位静默返回为long。如果您需要确保输入适合long,只需检查字符串长度是否小于等于16(删除空格后)。

10

Long.parseLong(s, 16) 只能将字符串转换为长度不大于 "7fffffffffffffff" 的十进制长整型数。建议使用 BigInteger 替代:

public static boolean isHex(String hex) {
    try {
        new BigInteger(hex, 16);
        return true;
    } catch (NumberFormatException e) {
        return false;
    }
}

1
这是没有人说的。从技术上讲,你应该能够使用长度为16且只包含F(FFFFFFFFFFFFFFFF)的字符串解析无符号长整型,但是Long.parseLong()仅适用于最大值7fffffffffffffff,就像你所说的那样。 - Coronel Kittycannon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接