adler-32 算法示例 Clarity would be great

adler-32 algorithm example Clarity would be great

我很难理解这个算法背后到底发生了什么。所以,我有以下代码,我相信它适用于维基百科示例。我似乎在匹配十六进制值的正确结果时遇到了问题。虽然对于 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,并继续遍历子字符串我的文本文件添加值,直到添加了所有字符。

output = finalValue.ToString("X");

"X"格式表示生成数字的十六进制表示!

参见 MSDN Standard Numeric Format Strings

可能这两行让您感到困惑。

     a = ( a + Convert.ToInt32(i)) % MOD_ADLER;
     b = (b + a) % MOD_ADLER;

每个字符都有整数表示。你可以检查这个article. You are changing the value a to be the reminder-> from current value of a + int representetion of the char divided by MOD_ADLER. You can read operator %

什么是提醒:5%2 = 1

之后你正在为 b 做同样的事情。 b等于b+a的提醒当前值除以MOD_ADLER。多次执行此操作后(字符串中的字符数)。你有这个。

        int finalValue = (b * ADLER_CONST2 + a);
        output = finalValue.ToString("X");

这会将最终的整数值转换为十六进制。