adler-32算法示例Clarity会很棒

时间:2015-02-05 03:01:45

标签: c# checksum

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

2 个答案:

答案 0 :(得分:0)

output = finalValue.ToString("X");

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

请参阅MSDN Standard Numeric Format Strings

答案 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。