You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过ASCII转换将字符串转为long时触发数字格式异常如何解决

问题原因
  • 首先long类型取值范围有限:Java中long是64位有符号整数,最大值为9223372036854775807,仅支持最多19位的十进制数。而每个ASCII字符对应的数值占1~3位,比如字符a对应ASCII码97(2位)、字符DEL对应ASCII码127(3位),只要输入字符串长度超过9个字符,拼接后的数字串长度就会超过19位,超出long的取值范围,触发NumberFormatException。
  • 输入空字符串/空值时,拼接得到的是空串,无法被解析为合法数值也会抛出异常。
  • 你粘贴的代码存在语法错误:方法定义行public long AsciiFromString(String inString)后缺少左大括号{,会直接编译失败。
解决方案

根据你的需求可以选择以下任意一种方案:

方案1:改用BigInteger存储拼接结果(保留ASCII拼接逻辑,无长度限制)

如果必须保留「每个字符ASCII码直接拼接」的逻辑,改用无长度上限的BigInteger类型存储结果即可,代码示例:

import java.math.BigInteger;

public class MyClass {
    public BigInteger AsciiFromString(String inString) {
        // 空值校验
        if (inString == null || inString.isEmpty()) {
            throw new IllegalArgumentException("输入字符串不能为空");
        }
        StringBuilder tempString = new StringBuilder();
        for (int i = 0; i < inString.length(); i++) {
            char c = inString.charAt(i);
            tempString.append((int) c);
        }
        return new BigInteger(tempString.toString());
    }
}

方案2:使用64位哈希算法(固定返回long类型,冲突概率极低)

如果必须返回long类型,放弃ASCII拼接逻辑,改用成熟的64位哈希算法,比如FNV-1a 64位哈希,得到的结果天然是long类型,不会溢出,且唯一性满足绝大多数场景需求,代码示例:

public class MyClass {
    public long AsciiFromString(String inString) {
        if (inString == null || inString.isEmpty()) {
            throw new IllegalArgumentException("输入字符串不能为空");
        }
        // FNV-1a 64位哈希初始值和质数
        long fnvPrime = 0x100000001b3L;
        long hash = 0xcbf29ce484222325L;
        for (char c : inString.toCharArray()) {
            hash ^= c;
            hash *= fnvPrime;
        }
        return hash;
    }
}

方案3:限制输入长度

如果必须保留ASCII拼接逻辑同时返回long,提前校验输入字符串长度,确保拼接后的数字串长度不超过19位,超出时直接抛出参数异常即可。

内容的提问来源于stack exchange,提问作者TheUltimateHack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 01:54:02