我想从文本文件中读取一个十六进制数字,使用最后一位数字来定义我读取字符串的长度,再读一个数字,依此类推,直到该行完成。
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不是奥尔加。为什么?
答案 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);
如果你在每一行之后,或在每一组重要的行之后,显示重要变量的值,你就可以准确地看到你的程序进入杂草的位置。