Передача данных по 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 }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д