Convert.ToInt32(string, 16) 是最快最稳的十六进制转整数方法,但需显式指定基数16;带"0x"前缀或非法字符会抛异常,应先清理前缀或改用int.TryParse(s, NumberStyles.HexNumber, ...)容错处理。
用
最快最稳
直接调用 .NET 内置方法就行,不用自己写循环或查表。它专为这种场景优化,处理合法十六进制字符串(如
、
、
)没问题。
注意:必须传入进制基数
,漏掉会默认按十进制解析,结果完全不对 —— 比如
得到的是
十进制值 255?错,它其实解析成十进制的 255,但字符串 "FF" 并不是十进制写法,这步会直接抛
。
→ 返回
→ 报错,
不识别
前缀
字符串含空格、换行、中文字符?一律抛
超范围(如
转
)会抛
处理带
前缀的字符串得先清理
很多硬件协议、调试日志、JSON 字段里十六进制数带
,比如
或
。
不吃这套,必须手动去掉前缀再转。
别用
—— 它会误杀中间含
的字符串(比如
)。稳妥做法是检查开头:
→ 然后取
或者更懒但安全:用正则
如果不确定有没有前缀,统一走
更省心(见下节)
要容错就用
线上代码别裸奔
,一出错就崩。用
是标准防御姿势,尤其面对用户输入、日志解析、配置文件等不可信来源。
C知道
CSDN推出的一款AI技术问答工具
下载
是关键:它允许前导空格、
前缀、大小写字母,比手撕判断靠谱得多。
支持
、
、
,全部能成功解析
失败时不抛异常,只返回
,变量保持原值或初始化为 0
记得传
,避免某些区域设置把字母当数字(极少见但存在)
示例:
大数或无符号数不能硬塞
十六进制字符串可能超
(
),比如
是 4294967295,已超出有符号 32 位范围。这时候转
必炸,但实际你可能只需要
、
或
。
转无符号:
转 64 位:
超 8 字节?上
,但注意它不带
版本,仍需 try/catch
别图省事全用
—— 小数值用
更省内存、CPU 缓存友好
进制转换本身没玄学,难的是边界判断和上下文适配。比如一个日志字段写着
,看着小,但若协议定义它是 64 位标志位的一部分,你就得按
解析,否则高位全丢。这种隐含契约,比语法更常埋雷。
Convert.ToInt32(string, 16)"FF""0x1A""aB3"16Convert.ToInt32("FF")FFFormatExceptionConvert.ToInt32("FF", 16)255Convert.ToInt32("0x1A", 16)Convert0xFormatException"FFFFFFFF"intOverflowException0x0x"0xFF""0xdeadbeef"Convert.ToInt32.Replace("0x", "")0x"abc0xdef"str.StartsWith("0x", StringComparison.OrdinalIgnoreCase)str.Substring(2)Regex.Replace(str, "^0x", "", RegexOptions.IgnoreCase)TryParseint.TryParse(string, NumberStyles.HexNumber, ...)Convert.ToInt32TryParseNumberStyles.HexNumber0x" 0xFF ""0Xab""dead"falseCultureInfo.InvariantCultureint.TryParse("0x1F", NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int result)intint.MaxValue0x7FFFFFFF"FFFFFFFF"intuintlongulonguint.TryParse(s, NumberStyles.HexNumber, null, out uint u)long.TryParse(s, NumberStyles.HexNumber, null, out long l)BigInteger.Parse(s, NumberStyles.HexNumber)TryParselongint"0x00000001"ulong