计算临床仪器的校验和

Calculate checksum for clinical instrument

我需要计算分析实验室仪器的校验和。我有这个例子:

我正在使用取自此 post 的方法: Calculate checksum for Laboratory Information System (LIS) frames

这是示例中计算校验和的代码:

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

这是我用来做图像测试的代码:

        string cStringStx = ((char)02).ToString();
        string cStringEtx = ((char)03).ToString();

        string cStx = CalculateChecksum(cStringStx);//Result: 02
        string c1 = CalculateChecksum("1");//Result: 31
        string cT = CalculateChecksum("T");//Result: 54
        string cE = CalculateChecksum("e");//Result: 65
        string cS = CalculateChecksum("s");//Result: 73
        string cT2 = CalculateChecksum("t");//Result: 74
        string cEtx = CalculateChecksum(cStringEtx);//Result: 03

        int nSum = Convert.ToInt16(cStx) +
                  Convert.ToInt16(c1) +
                  Convert.ToInt16(cT) +
                  Convert.ToInt16(cE) +
                  Convert.ToInt16(cS) +
                  Convert.ToInt16(cT2) +
                  Convert.ToInt16(cEtx);//Result: 302

        string cTot = CalculateChecksum(cStx + c1 + cT + cE + cS + cT2 + cEtx);//Result: D2

各个字符串的校验和正确,但总和不正确。 cTot 应该是 D4,而不是 D2。我做错了什么?

好吧,您似乎想 跳过 初始 [STX] 字符 (\u0002),同时对所有其他字符求和。您可以借助 Linq:

  using System.Linq;

  ...

  private static int CheckSum(string value) { 
    return value == null 
      ? 0
      : value.SkipWhile(c => c == 2).Sum(c => c) & 0xFF; 
  }

演示:

 string test = "\u00021Test\u0003";

 int sum = CheckSum(test);

 Console.Write(sum.ToString("X2"));

结果:

 D4