C#计算LRC(纵向冗余检查)

C#计算LRC(纵向冗余检查),c#,algorithm,serial-port,C#,Algorithm,Serial Port,我到处都在研究这个问题,所有的LRC实现似乎都没有给我正确的答案。在花了几天的时间之后,我决定把我的代码放在这里,看看是否有人能发现这个问题 这是代码(C#) //输入数据=“31303030315E315E31303030325E315E31303030375E39395E31303032325E36353631335E” //LRC Answer=“30” 专用静态字符串LRC(字符串数据) { 整数校验和=0; foreach(GetStringFromHex(数据)中的字符c) { 校验

我到处都在研究这个问题,所有的LRC实现似乎都没有给我正确的答案。在花了几天的时间之后,我决定把我的代码放在这里,看看是否有人能发现这个问题

这是代码(C#)

//输入数据=“31303030315E315E31303030325E315E31303030375E39395E31303032325E36353631335E”
//LRC Answer=“30”
专用静态字符串LRC(字符串数据)
{
整数校验和=0;
foreach(GetStringFromHex(数据)中的字符c)
{
校验和^=转换为字节(c);
}
字符串十六进制=校验和。ToString(“X2”);
Console.WriteLine(“计算的LRC=“+hex”);
返回十六进制;
}
//LRC函数中使用的支持函数
私有静态字符串GetStringFromHex(字符串s)
{
字符串结果=”;
字符串s2=s.Replace(“,”);
对于(int i=0;i
电流输出显示“计算的LRC=33”。然而,正确的答案是“30”。有人能发现这有什么问题吗


任何帮助都会很棒

经过多次测试后,确认LRC应包括ETX,并在LRC计算期间排除STX。

最好拼写“LRC”。。。我想它应该是某种校验码,比如CRC,或者卷积纠错码(比如Reed Solomon)?您的实现看起来像简单的奇偶校验。啊。。。没错,谢谢你的提醒,这是纵向冗余检查。维基百科的文章建议传统的做法是返回字节和(而不是异或)的补码(
-
)。但是说有些协议使用XOR,我也基于维基百科的伪代码实现了。它也给了我一个错误的答案。你有与你通信的设备的任何文档吗?它不能更好地定义校验和吗?
        //Input Data = "31303030315E315E31303030325E315E31303030375E39395E31303032325E36353631335E"
        //LRC Answer = "30"
        private static string LRC(string Data)
        {
            int checksum = 0;
            foreach (char c in GetStringFromHex(Data))
            {
                checksum ^= Convert.ToByte(c);
            }


            string hex = checksum.ToString("X2");

            Console.WriteLine("Calculated LRC = " + hex);

            return hex;
        }





    //Supporting Function used in LRC function
    private static string GetStringFromHex(string s)
    {
        string result = "";
        string s2 = s.Replace(" ", "");
        for (int i = 0; i < s2.Length; i += 2)
        {
            result += Convert.ToChar(int.Parse(s2.Substring(i, 2), System.Globalization.NumberStyles.HexNumber));
        }
        return result;
    }