C#按收割模式读取文本文件:获取目标字符串失败问题求助
问题解析与修复方案
你的代码里有两个关键问题,导致无法正确获取目标字符串"olga":
1. Substring起始索引完全错误
你在这段代码里犯了典型的类型混淆错误:
string b = line.Substring(c, length);
这里的c是字符类型的'4',它的ASCII数值是52,而你的输入字符串"5A3F00004olga"总长度只有13(索引范围0-12),用52作为起始索引不仅远远超出了字符串的有效范围,完全偏离了你想要的「从十六进制数的下一位开始截取」的逻辑。
你真正需要的起始索引是前9位十六进制数的长度,也就是9——因为前9位是5A3F00004,后续的目标字符串从索引9的位置开始。
2. 十六进制字符转数值的逻辑有漏洞
当前代码里的int con = c - '0'只对0-9的数字字符有效,如果十六进制数的最后一位是A-F(比如'C'),这种计算方式会得到完全错误的数值(比如'C'-'0'=52,转成十六进制再转int会得到52,而实际十六进制C对应的十进制是12)。正确的做法是直接用十六进制解析规则来转换单个字符。
修正后的完整代码
using (StreamReader sr = new StreamReader(fileName)) { string line = sr.ReadLine(); if (string.IsNullOrEmpty(line)) { // 处理空行的边界情况 return; } // 读取前9位的十六进制文本,同时避免行长度不足9的异常 int hexSegmentLength = 9; string hexText = line.Substring(0, Math.Min(hexSegmentLength, line.Length)); char lastHexChar = hexText[hexText.Length - 1]; // 正确解析十六进制字符为整数(支持0-9、A-F、a-f) if (!int.TryParse(lastHexChar.ToString(), System.Globalization.NumberStyles.HexNumber, null, out int targetLength)) { Console.WriteLine("错误:十六进制结尾字符无效"); return; } // 计算目标字符串的起始位置:跳过前面的十六进制段 int startIndex = hexSegmentLength; // 提前检查是否有足够的字符可以截取,避免越界 if (startIndex + targetLength > line.Length) { Console.WriteLine("错误:字符串长度不足,无法截取目标内容"); return; } // 正确获取目标字符串 string targetStr = line.Substring(startIndex, targetLength); // 此时targetStr就是你想要的"olga" }
针对你的输入的验证
对于输入"5A3F00004olga":
- 前9位是
5A3F00004,最后一位字符'4'解析后得到长度4 - 起始索引为9,从索引9开始截取4个字符,正好得到
"olga"
内容的提问来源于stack exchange,提问作者Monika
相关产品推荐
相关产品推荐

