用收割模式读取文本文件c#

时间:2018-06-01 01:28:49

标签: c# algorithm

我想从文本文件中读取一个十六进制数字,使用最后一位数字来定义我读取字符串的长度,再读一个数字,依此类推,直到该行完成。

         using (StreamReader sr = new StreamReader(fileName)){
                String line = sr.ReadLine();
                string hexText = line.Substring(0,9);

                char c = hexText[8];
                int con = c - '0'; //saving the value
                string myHex = con.ToString("X");  
                int length = Convert.ToInt32(myHex, 16);
                string fieldChars = line.Substring(0, length); //getting the key
                string b = line.Substring(c, length); }

所以" 5A3F00004olga"长度是正确的4(最后一个十六进制位)但由于某种原因b不是奥尔加。为什么?

1 个答案:

答案 0 :(得分:1)

让我们仔细看看你的代码。你有:

char c = hexText[8];
int con = c - '0'; //saving the value
string myHex = con.ToString("X");  
int length = Convert.ToInt32(myHex, 16);
string fieldChars = line.Substring(0, length); //getting the key
string b = line.Substring(c, length);

所以c包含位置8处字符的值。我不知道你为什么从它中减去'0',然后将结果转换回字符串。你可以这么容易地写:

string myHex = c + "X";

此外,如果hexText[8]的值为'A',则减去“0”会得到17而不是您预期的10。

我也不知道你期望分配fieldChars的行是什么,但我几乎可以保证它不会做你想要的。

b不包含“olga”的原因是因为在这种情况下子字符串起始位置为4(十进制44),而length可能完全错误如上所述。

我认为您想要的代码是:

char c = hexText[8];
string myHex = con.ToString("X");
int length = Convert.ToInt32(myHex, 16);
string b = line.Substring(9, length);

我没有在那里加fieldChars,因为我不清楚你希望该变量保留的值。如果你想要密钥,那么你需要line.Substring(0, 8);如果你想要整个字段,包括密钥,长度和文本,你可以写line.Substring(0, 9 + length);

正如评论中所建议的那样,您可以使用C#调试器一次一行地遍历代码,并检查变量以查看发生的情况。这是查看您编写的代码结果的绝佳方式。更好的是在开始编写代码之前手动编写一些示例。这样你就可以更好地理解代码应该做什么。它使编写正确的代码变得更加容易。

如果您不知道如何使用调试器,现在是学习的最佳时机。

另一种可以看到正在发生的事情的方法是在每行之后放置Console.WriteLine语句。例如:

char c = hexText[8];
Console.WriteLine("c = " + c);

如果你在每一行之后,或在每一组重要的行之后,显示重要变量的值,你就可以准确地看到你的程序进入杂草的位置。