如何在java中将十六进制字符串转换为long?

Posted

技术标签:

【中文标题】如何在java中将十六进制字符串转换为long?【英文标题】:How to convert a hexadecimal string to long in java? 【发布时间】:2011-07-06 10:40:44 【问题描述】:

我想在java中将一个十六进制字符串转换为long。

我尝试过一般转换。

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中将String转换为long?还是我在尝试这是不可能的!

谢谢!

【问题讨论】:

在调用 valueOf 之前尝试在字符串中添加“0x”前缀 嗯......你看过javadocs吗?节省自己的时间,始终先查看 javadocs。 另外,valueOf 应该接受指定基数的第二个参数。尝试传递 16(以及不带前缀的字符串) @sinelaw - 我认为您将Long.valueOf(String)Long.decode(String) 混淆了。 valueOf(String) 的 Javadoc 说 “将字符串参数解析为有符号十进制长。” 斯蒂芬,对,是解码接受前缀。但是 valueOf 接受基本参数(见上面的链接) 【参考方案1】:

Long.decode(str)接受多种格式:

接受十进制、十六进制和八进制 以下给出的数字 语法: 可解码字符串:

符号opt DecimalNumeral 签名opt 0x HexDigits 签名opt 0X HexDigits 签名opt #HexDigits 签名opt 0 个八进制数

签名:

-

但是在您的情况下,这无济于事,您的 String 超出了 long 可以容纳的范围。你需要一个BigInteger:

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

输出:

23846102773961507302322850521

为了比较,这里是Long.MAX_VALUE

9223372036854775807

【讨论】:

不确定 System.out.println 方法签名,但在字符串赋值中使用 bi 我需要使用 bi.toString() @JECarterII println 在对象上调用该对象的 toString() 方法 清晰的谢谢! 通过打印堆栈跟踪,似乎Long.decode() 只是调用了Long.parseLong() @PLG 它是Long.valueOf 周围的外观,而它又使用Long.parseLongLong.decode的具体用途是检测输入的字符串是十进制、八进制还是十六进制,然后用检测到的基数调用Long.valueOf【参考方案2】:

使用 parseLong:

Long.parseLong(s, 16)

【讨论】:

一般情况下为真,但在这种情况下失败(对于 Long 而言,数字太大了) 还是抛出NumberFormatException,太长了。 @Suresh:是的,您的示例字符串无法转换为长字符串,我只是在回答“如何将十六进制字符串转换为长字符串”。您可能想看看 Sean Patrick Floyd 提到的 BigInteger。 目标是转换成Long,对吧?那么这就是干净简单的方法! @SeanPatrickFloyd 这是 OP 的问题,而不是这个答案的问题。【参考方案3】:
new BigInteger(string, 16).longValue()

对于 someLong 的任意值:

new BigInteger(Long.toHexString(someLong), 16).longValue() == someLong

换句话说,这将返回您发送到Long.toHexString()long,用于任何long 值,包括负数。它还将接受大于long 的字符串,并将字符串的低64 位作为long 静默返回。如果您需要确保输入适合 long,则只需检查字符串长度

【讨论】:

【参考方案4】:

Long.parseLong(s, 16) 仅适用于 "7fffffffffffffff"。请改用BigInteger

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

【讨论】:

这是没人说的。从技术上讲,您应该能够使用长度为 16 且只有 F (FFFFFFFFFFFFFFFF) 的字符串解析无符号长整数,但正如您所说,Long.parseLong() 最多只能工作 7fffffffffffffff。

以上是关于如何在java中将十六进制字符串转换为long?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将字符从字母字符转换为十六进制数字?

如何在 Java 中将二进制字符串转换为以 10 为底的整数

在java中将十六进制数字字符串转换为双精度数字

在 Java 中将字符串转换为十六进制

如何在 Spring Boot 应用程序中将 java lang long 转换为实体类

在c#中将字符串转换为long时的问题