Dart中十六进制字符串转ASCII字符串报错,求解决方案
Dart中十六进制字符串转ASCII字符串的问题解决方法
问题描述
我需要将十六进制字符串转换为ASCII字符串,使用了如下函数:
String hexToAscii(String hexString) => List.generate( hexString.length ~/ 2, (i) => String.fromCharCode(int.parse(hexString.substring(i * 2, (i * 2) + 2), radix: 16)), ).join();
使用样例十六进制值20354653474955时,出现以下错误:
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: RangeError (end): Invalid value: Not in inclusive range 20..21: 22
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: FormatException: Invalid radix-16 number (at character 1)
错误原因
- RangeError:当十六进制字符串长度为奇数时,
hexString.length ~/ 2计算出的迭代次数会导致substring的结束索引超出字符串范围。 - FormatException:输入字符串包含非十六进制字符(0-9、a-f、A-F以外的字符),或者分割出的片段无法解析为十六进制数。
解决方法
1. 校验并处理字符串长度
确保输入的十六进制字符串长度为偶数,若为奇数可选择补0或抛出明确异常:
if (hexString.length % 2 != 0) { // 方案1:开头补0 hexString = '0$hexString'; // 方案2:抛出异常提示输入无效 // throw ArgumentError('十六进制字符串长度必须为偶数'); }
2. 验证十六进制字符有效性
提前过滤非十六进制字符,避免解析失败:
final validHexRegex = RegExp(r'^[0-9a-fA-F]+$'); if (!validHexRegex.hasMatch(hexString)) { throw ArgumentError('输入不是有效的十六进制字符串'); }
3. 完整优化后的函数
结合上述校验,修改后的转换函数如下:
String hexToAscii(String hexString) { // 验证十六进制格式 final validHexRegex = RegExp(r'^[0-9a-fA-F]+$'); if (!validHexRegex.hasMatch(hexString)) { throw ArgumentError('输入不是有效的十六进制字符串'); } // 处理奇数长度的十六进制字符串 if (hexString.length % 2 != 0) { hexString = '0$hexString'; } return List.generate( hexString.length ~/ 2, (i) { final start = i * 2; final end = start + 2; final hexSegment = hexString.substring(start, end); return String.fromCharCode(int.parse(hexSegment, radix: 16)); }, ).join(); }
4. 测试样例
输入20354653474955时,转换结果为 5FSGIU(对应十六进制片段:20=空格、35=5、46=F、53=S、47=G、49=I、55=U),可正常运行。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

