十六进制转字符串遇System.FormatException:问题原因及解决方法
问题原因
你的代码仅替换了字符串中的0x前缀,但未处理原字符串里的空格分隔符。处理后的字符串会变成类似"53 50 31 32..."的形式,包含空格字符。循环中每次截取2个字符时,会出现" 5"这类包含空格的片段,而Convert.ToInt32无法将空格识别为十六进制有效数字,因此抛出FormatException。
解决办法
提供两种可行的修复方案:
方案一:移除所有空格后处理
直接在预处理阶段移除所有空格,确保字符串是连续的十六进制字符:
hex = hex.Replace("0x", "").Replace(" ", ""); // 同时移除0x和空格 hex = hex.Trim(); StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < hex.Length; i += 2) { string hs = hex.Substring(i, 2); stringBuilder.Append(Convert.ToChar(Convert.ToInt32(hs,16))); }
方案二:按空格分割后逐个处理
先将原字符串按空格拆分为独立的十六进制片段,再逐个处理(更鲁棒,支持多连续空格场景):
// 按空格分割并过滤空项 var hexSegments = hex.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); StringBuilder stringBuilder = new StringBuilder(); foreach (var segment in hexSegments) { // 移除每个片段的0x前缀 var cleanSegment = segment.Replace("0x", ""); stringBuilder.Append(Convert.ToChar(Convert.ToInt32(cleanSegment, 16))); }
验证结果
原十六进制数据0x53 0x50 0x31 0x32 0x33 0x34 0x35 0x36对应的字符串结果为SP123456,两种方案均可正确输出该结果。
内容的提问来源于stack exchange,提问作者Akav
相关产品推荐
相关产品推荐

