我很难理解这个算法背后到底发生了什么。所以,我有以下代码,我认为这些代码适用于维基百科的例子。我似乎在匹配十六进制值的正确结果时遇到了问题。对于wiki示例,我得到了正确的十六进制值,似乎我的int finalValue;
不是正确的值。
string fText, fileName, output;
Int32 a = 1 , b = 0;
const int MOD_ADLER = 65521;
const int ADLER_CONST2 = 65536;
private void btnCalculate_Click(object sender, EventArgs e) {
fileName = tbFilePath.Text;
if(fileName != "" && File.Exists(fileName)) {
fText = File.ReadAllText(fileName);
foreach (char i in fText) {
a = ( a + Convert.ToInt32(i)) % MOD_ADLER;
b = (b + a) % MOD_ADLER;
}
int finalValue = (b * ADLER_CONST2 + a);
output = finalValue.ToString("X");
lbValue.Text = output.ToString();
}
else {
MessageBox.Show("This is not a valid filepath, or is a blank file.\n" +
"Please enter a valid file path.");
}
}
我知道这不是一个有效的方法来解决这个问题,我只是想了解一下真正发生了什么。这样我就可以创建一个更加有效的算法。
从我的理解。在我的代码中,示例值a将被添加整数(32位)值加上其初始值1.我执行非常高的素数的Mod,并继续移动我的文本文件的子字符串将这些值相加,直到所有字符都已添加为止。
答案 0 :(得分:0)
答案 1 :(得分:0)
这两行可能会让你感到困惑。
a = ( a + Convert.ToInt32(i)) % MOD_ADLER;
b = (b + a) % MOD_ADLER;
每个char都有整数表示。您可以查看article。您正在将值a更改为提醒 - >从char的一个+ int表示的当前值除以MOD_ADLER。您可以阅读operator %
什么是提醒:5%2 = 1
之后你为b做同样的事情。 b等于b + a的提醒当前值除以MOD_ADLER。多次这样做之后(字符串中的字符数)。你有这个。
int finalValue = (b * ADLER_CONST2 + a);
output = finalValue.ToString("X");
这会将最终整数值转换为HEX。