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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:56:07