Передача данных по 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
}