Передача данных по COM-порту. Подсчет контрольной суммы - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! помогите перевести с языка ПАСКАЛЬ на C#
Способ подсчета контрольной суммы. 1. Загружаем 16-битную беззнаковую переменную (KS) всеми единицами (KS=65535) 2. Выполняем операцию "ИСКЛЮЧАЮЩЕЕ ИЛИ" над первым байтом массива, который защищается контрольной суммой, и младшим байтом переменной KS. Результат заносится в переменную KS. 3. Сдвигаем KS на 1 бит вправо, при этом самый левый бит делаем равным нулю. 4а. Если выдвинутый бит равен 1, выполняется операция "ИСКЛЮЧАЮЩЕЕ ИЛИ" над переменной KS и числом 40961(десятичное). Результат заносится в перемен- ную KS. 4б. Если выдвинутый бит равен 0, выполняем переход на пункт 3. 5. Повторить пункты 3 и 4 пока не будет выполнено 8 сдвигов. 6. Повторить пункты 2,3,4 и 5 со следующим байтом массива, защищаемого контрольной суммой. 7. Содержимое полученной переменной KS и есть контрольная сумма.
Пример подсчета контрольной суммы на языке ПАСКАЛЬ.
-------------------------------------------------------------------
 Program K_S;
 VAR ST:STRING;
 
  FUNCTION KSUM(VAR S:STRING):STRING;
   VAR I,L:INTEGER;
        KS:WORD;
        SS:STRING;
   BEGIN
     KS:=65535;
     FOR I:=2 TO LENGTH(S) DO
      BEGIN
       KS:=KS XOR ORD(S[I]);
       FOR L:=1 TO 8 DO
        IF (KS DIV 2)*2<>KS THEN KS:=(KS DIV 2) XOR 40961
                            ELSE KS:=(KS DIV 2);
      END;
     Str(KS,SS); { Преобразование KS в текстовый вид }
     KSUM:=SS;
   END;
 
 BEGIN
  ST:= ':1;0;' ;        { Пример исходной строки без контр.суммы }
  ST:=ST+KSUM(ST)+#13;
  WRITELN(ST);
 END.
-------------------------------------------------------------------
Спасибо!

Решение задачи: «Передача данных по COM-порту. Подсчет контрольной суммы»

textual
Листинг программы
/// <summary>
/// Метод расчета и выдачи кода CRC
/// </summary>
/// <param name="Buffer">Массив, для которого идёт расчет контрольной суммы</param>
/// <returns>два байта CRC</returns>
        public ushort GetCRC(byte[] Buffer)
        {
            ushort Registr = 0xFFFF;
            for (int i = 0; i < Buffer.Length; i++)
            {
                Registr = (ushort)(Registr ^ Buffer[i]);
 
                for (int j = 0; j < 8; j++)
                    if ((Registr & 0x1) == 1)
                    {
                        Registr = (ushort)(Registr >> 1);
                        Registr = (ushort)(Registr ^ 0xA001);
                    }
                    else
                        Registr = (ushort)(Registr >> 1);
            }
 
            return Registr;           //возвращение двух байтов CRC
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы