15

我正在为实验室信息系统开发仪器驱动程序。我想知道如何计算帧的校验和。

校验和算法说明:

  1. 用字符 [0-9] 和 [AF] 表示。

  2. 从 [STX] 之后的字符开始到 [ETB] 或 [ETX](包括 [ETB] 或 [ETX])的字符以二进制形式添加。

  3. 代表十六进制代码中最低有效 8 位的 2 位数字被转换为 ASCII 字符 [0-9] 和 [AF]。

  4. 最高有效位存储在 CHK1 中,最低有效位存储在 CHK2 中。

我没有得到上面的第 3 点和第 4 点。

这是一个示例框架:

<STX>2Q|1|2^1||||20011001153000<CR><ETX><CHK1><CHK2><CR><LF>

CHK1和的值是CHK2多少?如何在 C# 中实现给定的算法?

4

3 回答 3

19

最后我得到了答案,这里是计算校验和的代码:

private string CalculateChecksum(string dataToCalculate)
{
    byte[] byteToCalculate = Encoding.ASCII.GetBytes(dataToCalculate);
    int checksum = 0;
    foreach (byte chData in byteToCalculate)
    {
        checksum += chData;
    }
    checksum &= 0xff;
    return checksum.ToString("X2");
}
于 2012-07-02T12:14:24.993 回答
1

您可以在一行中执行此操作:

return Encoding.ASCII.GetBytes(dataToCalculate).Aggregate((r, n) => r += n).ToString("X2");
于 2019-10-29T22:53:00.477 回答
-4
private bool CheckChecksum(string data)
{
   bool isValid =false

   byte[] byteToCalculate = Encoding.ASCII.GetBytes(dataToCalculate);
   int checkSum = 0;
   for ( int i=i i<byteToCalculate.Length;i++)
   {
      checkSum += byteToCalculate[i];
   }
   checksum &= 0xff;

  if (checksum == byteToCalculate[ChecksumPlace]
  {
   return true
  }
  else
  {
  return  false
  }
}
于 2015-06-11T07:34:59.220 回答