我正在为.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位校验和。
任何有关计算这方面的帮助都会非常感激,因为我正在努力。
答案 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。