我正在为基于C#的信使系统中的清单文件编写校验和,这与.NET环境有关。 我需要一个8位数字字段代表校验和,其计算方式如下:
记录校验和算法
形成每个字符的7个低位ASCII字符的乘积的32位算术和。
• 记录中每个字符的位置从第1个字符开始编号。
对于记录长度达到但不包括校验和字段本身:
总和= Σi ASCII(记录中的第ith个字符)。(i)
其中i覆盖长度不包括校验和字段的记录。
执行此计算后,将结果总和转换为二进制,并将Sum的32个低位拆分为8个4位块(八位组)。 请注意,每个八位组具有介于0和15之间的十进制数值。
给每个八位组添加ASCII 0(零)的偏移量以形成ASCII代码数字。
将ASCII代码数字转换为其等效的ASCII字符,从而形成范围在0123456789:;<=>?内的可打印字符。
将每个字符连接起来形成总长度为8个字符的单个字符串。
我不是最擅长数学,所以我很难按照文档正确编写代码。 我已经编写了以下内容:
记录校验和算法
形成每个字符的7个低位ASCII字符的乘积的32位算术和。
• 记录中每个字符的位置从第1个字符开始编号。
对于记录长度达到但不包括校验和字段本身:
总和= Σi ASCII(记录中的第ith个字符)。(i)
其中i覆盖长度不包括校验和字段的记录。
执行此计算后,将结果总和转换为二进制,并将Sum的32个低位拆分为8个4位块(八位组)。 请注意,每个八位组具有介于0和15之间的十进制数值。
给每个八位组添加ASCII 0(零)的偏移量以形成ASCII代码数字。
将ASCII代码数字转换为其等效的ASCII字符,从而形成范围在0123456789:;<=>?内的可打印字符。
将每个字符连接起来形成总长度为8个字符的单个字符串。
我不是最擅长数学,所以我很难按照文档正确编写代码。 我已经编写了以下内容:
byte[] sumOfAscii = null;
for(int i = 1; i< recordCheckSum.Length; i++)
{
string indexChar = recordCheckSum.ElementAt(i).ToString();
byte[] asciiChar = Encoding.ASCII.GetBytes(indexChar);
for(int x = 0; x<asciiChar[6]; x++)
{
sumOfAscii += asciiChar[x];
}
}
//Turn into octets
byte firstOctet = 0;
for(int i = 0;i< sumOfAscii[6]; i++)
{
firstOctet += recordCheckSum;
}
recordCheckSum是由送货地址、产品名称等组成的字符串,不包括8位数的校验和。
如果能提供计算方法,将不胜感激,因为我很困难。