Конвертировать CRC-CCITT KERMIT 16 DELPHI CODE к C #
Вопрос
Я работаю над функцией, которая даст мне значение Кермита CRC из шестигранной строки. У меня есть кусок кода в Delphi. Я являюсь разработчиком .NET и нужен код в C #.
function CRC_16(cadena : string):word;
var
valuehex : word;
i: integer;
CRC : word;
Begin
CRC := 0;
for i := 1 to length(cadena) do
begin
valuehex := ((ord(cadena[i]) XOR CRC) AND $0F) * $1081;
CRC := CRC SHR 4;
CRC := CRC XOR valuehex;
valuehex := (((ord(cadena[i]) SHR 4) XOR LO(CRC)) AND $0F);
CRC := CRC SHR 4;
CRC := CRC XOR (valuehex * $1081);
end;
CRC_16 := (LO(CRC) SHL 8) OR HI(CRC);
end;
Я получил код из этой веб-страницы: Кермит КРК в Delphi
Я думаю, что функция Delphi верна. Если кто-то может, пожалуйста, преобразовать код в C #, который будет отличным. Я пытался преобразовать в C #, но потерял в типе данных Word и функцию Delphi. Спасибо вам всем.
Решение
От MSDN Форумы:
static long ComputeCRC(byte[] val)
{
long crc;
long q;
byte c;
crc = 0;
for (int i = 0; i < val.Length; i++)
{
c = val[i];
q = (crc ^ c) & 0x0f;
crc = (crc >> 4) ^ (q * 0x1081);
q = (crc ^ (c >> 4)) & 0xf;
crc = (crc >> 4) ^ (q * 0x1081);
}
return (byte)crc << 8 | (byte)(crc >> 8);
}
Использовать Encoding.Ascii.Getbytes (строка) Конвертировать A. string
к А. byte[]
.
Другие советы
Слово - это 16-битное целое число без знака (которое может хранить значения 0..65535).
LO возвращает байт низкого порядка целого числа. Так что, если целое число составляет 0x7B41AF, например, LO вернется 0xaf.