您的位置:首页 >Java十六进制转整数方法详解
发布于2026-03-05 阅读(0)
扫一扫,手机访问
Integer.parseInt("FF", 16) 抛 NumberFormatException 的主因是字符串含不可见字符或空格,而非进制错误;Java 要求输入严格无空白、无前缀、无非十六进制字符,需先 trim() 再解析。

NumberFormatException核心问题不是进制写错了,而是字符串里混入了不可见字符或空格。Java 的 Integer.parseInt 对输入极其严格:开头结尾不能有空白,不能有前缀(如 "0x" 或 "0X"),也不能含非十六进制字符(包括全角字母、中文符号、BOM 头)。
常见错误现象:NumberFormatException: For input string: " FF" 或 "ff " —— 看似正常,实则首尾有空格;又或者从文件/HTTP 响应读出的字符串带 UTF-8 BOM("\uFEFFFF"),直接解析必挂。
str.trim(),再检查是否为空str.replaceAll("[^0-9a-fA-F]", "")(慎用,会删掉所有非十六进制字符,仅适用于纯数据提取场景)"0x" 前缀?别手动截取,改用 Integer.decode(str),它原生支持 "0xFF"、"#FF"、"FF" 三种格式Integer.parseInt 只能处理 32 位有符号整数,即最大到 0x7FFFFFFF(2147483647)。一旦字符串表示的值 ≥ 0x80000000(比如 "FFFFFFFF"),就会因溢出抛异常,而不是返回负数——它根本不会尝试“补码解释”,而是直接拒绝。
使用场景:解析网络协议里的无符号 32 位字段、哈希摘要片段、内存地址等,这些本就不该被当“有符号 int”看待。
Long.parseLong(str, 16) 替代,只要不超过 0x7FFFFFFFFFFFFFFF 都安全"FFFFFFFF" → 4294967295),用 Integer.parseUnsignedInt(str, 16)(JDK 8+),它返回 int 类型但按无符号逻辑解析BigInteger:new BigInteger(str, 16)没区别。Integer.parseInt(str, 16) 内部对字母 a–f 和 A–F 一视同仁,全部映射为 10–15。这不是“兼容模式”,而是规范定义的行为。
但要注意:如果你后续要做字符串比较、缓存 key 或写入日志,大小写不统一可能引发隐性 bug。比如 "ab" 和 "AB" 解析结果相同,但作为 Map key 就是两个不同键。
String.format("%02X", value) 转成大写定长形式String.toUpperCase() 在土耳其语环境下可能把 'i' 转成特殊字符,不要用它来“统一大小写”再解析三者底层几乎一样,但语义和边界行为不同。Integer.valueOf(str, 16) 和 Integer.parseInt(str, 16) 在数值解析阶段完全共用同一套逻辑,区别只在最后一步:前者装箱,后者返基本类型。而 Integer.decode(str) 多一层前缀识别开销,但对不含前缀的字符串,它会 fallback 到 parseInt,实际差距可忽略。
真正影响性能的是字符串本身:长度越长、内容越不规则(如大量无效字符),失败路径越慢(异常构造成本高)。
parseInt 最直白"0x"、"#"),选 decode,别自己写前缀判断valueOf,徒增 GC 压力十六进制解析看着简单,但真实环境里最常栽在不可见字符、无符号边界和前缀处理上。别假设输入“应该”合规,先 trim,再判空,再 decode 或 parseUnsignedInt —— 这三步加起来不到十行,省去半夜查 log 的时间。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9