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");
这会将最终的整数值转换为十六进制。
我很难理解这个算法背后到底发生了什么。所以,我有以下代码,我相信它适用于维基百科示例。我似乎在匹配十六进制值的正确结果时遇到了问题。虽然对于 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");
这会将最终的整数值转换为十六进制。