在C#中计算校验和

时间:2016-06-06 00:29:09

标签: c# asp.net-mvc string checksum

我正在为.NET环境中用C#编写的基于courrier的系统的清单文件编写校验和。 我需要一个8位字段表示校验和,该字段按以下计算:

记录校验和算法 形成

产品的32位算术和

•记录

中每个ASCII字符的7个低位

•记录中每个字符的位置,编号为1,表示第一个字符。 对于记录的长度,但不包括校验和字段本身:

Sum =ΣiASCII(记录中的第i个字符)。(i) 我在记录的长度上运行,不包括支票金额。

执行此计算后,将结果和转换为二进制并拆分32低位 将Sum的比特分成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是由deliveryAddresses,产品名称等组成的字符串,不包括8位校验和。

任何有关计算这方面的帮助都会非常感激,因为我正在努力。

1 个答案:

答案 0 :(得分:2)

随着我的进展,有一些注意事项。关于最后计算的更多说明。

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);

请注意,我使用的是&>>运算符,您可能熟悉或不熟悉这些运算符。 &运算符是bitwise and运算符。 >>运算符为logical shift right