在C#中计算校验和

4
我正在为基于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个字符的单个字符串。
我不是最擅长数学,所以我很难按照文档正确编写代码。 我已经编写了以下内容:
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位数的校验和。

如果能提供计算方法,将不胜感激,因为我很困难。

1个回答

6
我在进行操作时会有笔记。最后还有一些关于计算的注释。
uint sum = 0;
uint zeroOffset = 0x30; // ASCII '0'

byte[] inputData = Encoding.ASCII.GetBytes(recordCheckSum);

for (int i = 0; i < inputData.Length; i++)
{
    int product = inputData[i] & 0x7F; // Take the low 7 bits from the record.
    product *= i + 1; // Multiply by the 1 based position.
    sum += (uint)product; // Add the product to the running sum.
}

byte[] result = new byte[8];
for (int i = 0; i < 8; i++) // if the checksum is reversed, make this:
                            // for (int i = 7; i >=0; i--) 
{
    uint current = (uint)(sum & 0x0f); // take the lowest 4 bits.
    current += zeroOffset; // Add '0'
    result[i] = (byte)current;
    sum = sum >> 4; // Right shift the bottom 4 bits off.
}

string checksum = Encoding.ASCII.GetString(result);

需要注意的是,我使用了&>>运算符,这些运算符您可能或可能不熟悉。 &运算符是按位与运算符。 >>运算符是逻辑右移运算符。


太棒了的回答!非常感谢你! - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接