如何在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.parseLong
。 Long.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 中将二进制字符串转换为以 10 为底的整数