Я изучаю это повсюду, и вся реализация 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». Кто-нибудь может понять, что в этом плохого?
Любая помощь будет фантастической!
Было бы хорошо указать «LRC» ... Я предполагаю, что это должен быть какой-то код проверки, например, CRC или сверточный код коррекции ошибок (например, Рид-Соломон)? Ваша реализация выглядит как простой паритет. –
Ах ... Правда, спасибо за напоминание, это проверка продольной избыточности. – WorldWind
Статья в Википедии предполагает, что традиционно возвращать дополнение ('-' в C#) двоичной суммы суммы (а не XOR) байтов. Но некоторые протоколы используют XOR. –