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

C#十六进制转十/二进制代码报错,求非法输入校验方案

十六进制转十进制/二进制的输入校验修复

你的问题出在正则表达式的写法和校验逻辑完全错误,导致无效输入没被拦截,进入转换步骤时抛出异常。

问题分析

你写的[^-9A-F]+$和[^-9a-f]+$存在两个致命问题:

  1. 正则语法错误:-放在9前面会被解析为范围符号(匹配从^到9的字符,完全偏离需求);
  2. 逻辑颠倒:[^...]是匹配非指定范围内的字符,再加上||,意味着只要输入包含非法字符,就会把valid设为true,直接跳过错误提示进入转换环节,自然会触发报错。

修复方案

用正确的正则表达式匹配合法十六进制字符,并调整校验逻辑:

  • 合法十六进制的正则应为:^[0-9A-Fa-f]+$,表示整个字符串只能由0-9、大小写A-F组成;
  • 当正则匹配成功时,说明输入合法,才将valid设为true。

修正后的完整代码

bool valid = false;
string hexadecimalnum = HexadecimalTxt.Text;

// 校验用户输入是否为0-9、a-f(大小写)范围内的十六进制字符
if (Regex.IsMatch(hexadecimalnum, "^[0-9A-Fa-f]+$"))
{
    valid = true;
}

// 条件成立则将十六进制数转换为二进制和十进制
if (valid)
{
    DecimalTxt.Text = Convert.ToInt32(hexadecimalnum, 16).ToString();
    int temp = Convert.ToInt32(hexadecimalnum, 16);
    BinaryTxt.Text = Convert.ToString(temp, 2);
}
// 条件不成立则输出无效数字提示
else
{
    MessageBox.Show("Invalid - please enter a hexadecimal value in this box");
}

额外提示:如果需要支持带0x前缀的十六进制输入,可以把正则改成^0x[0-9A-Fa-f]+$|^[0-9A-Fa-f]+$,Convert.ToInt32会自动识别0x前缀,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:25:14