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

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)

错误原因

  1. RangeError:当十六进制字符串长度为奇数时,hexString.length ~/ 2计算出的迭代次数会导致substring的结束索引超出字符串范围。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:55:00