2015-03-15 4 views
2

Я изучаю это повсюду, и вся реализация LRC, кажется, не дает мне правильного ответа. Проведя несколько дней на этом, я решил поставить здесь свой код, чтобы узнать, может ли кто-нибудь еще обнаружить проблему.C# Calculate LRC (Проверка продольной избыточности)

Вот код (С #)

 //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; 
    } 

тока на выходе показывает "Рассчитано LRC = 33". Однако правильный ответ - «30». Кто-нибудь может понять, что в этом плохого?

Любая помощь будет фантастической!

+1

Было бы хорошо указать «LRC» ... Я предполагаю, что это должен быть какой-то код проверки, например, CRC или сверточный код коррекции ошибок (например, Рид-Соломон)? Ваша реализация выглядит как простой паритет. –

+0

Ах ... Правда, спасибо за напоминание, это проверка продольной избыточности. – WorldWind

+0

Статья в Википедии предполагает, что традиционно возвращать дополнение ('-' в C#) двоичной суммы суммы (а не XOR) байтов. Но некоторые протоколы используют XOR. –

ответ

1

После нескольких испытаний подтверждено, что LRC должен включать в себя ETX и исключать STX во время вычисления LRC.

Смежные вопросы