2010-05-09 4 views
0

Я работаю над функцией, которая даст мне значение ККМ Kermit из строки HEX. У меня есть код в DELPHI. Я разработчик .NET и нуждаюсь в коде в C#.Преобразование CRC-CCITT Kermit 16 Код DELPHI в 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; 

Я получил код с этой страницы: Kermit CRC in DELPHI

Я предполагаю, что функция Delphi правильно. Если кто-то может конвертировать код в C#, это будет здорово. Я попытался преобразовать в C#, но потерялся в типе данных WORD и функции LO Delphi. Спасибо вам всем.

+0

В Delphi функция действительно должна быть определена как 'function CRC_16 (const cadena: string): word;'. –

ответ

1

От MSDN forums:

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(string) для преобразования string в byte[].

+0

ДА! Он работал на 95% правильно. Это URL, который я использую в качестве ссылки: http://www.lammertbies.nl/comm/info/crc-calculation.html для строки HEX 'absdef', которую дает URL (KERMIT) = 0x5A43, но выше код дает = 435A. Таким образом, первый и последний два LETTERS/DIGITS меняются местами. Все, что я сделал сейчас, = Строковый результат = crc.ToString ("X"); result = result.Substring (2, 2) + result.Substring (0, 2); Мне нужен результат в String, поэтому он отлично работает. Спасибо. Я соглашусь с этим ответом, даже если вы не отправляете сообщение с фиксированной заменой на 2 письма. Не очень, это сработало, я счастлив. –

+0

СЕРЬЕЗНАЯ Проблема: для HexString = ACA1F0FE00000000, Kermit CRC = 8602. Вышеприведенный код дает = 286. Теперь я не могу перевести 286 на 8602, используя мой метод выше комментария. –

+0

@Mehdi Anis: Я обновил свой ответ, чтобы поменять байты. Теперь он возвращает 0x8602 для вашей шестнадцатеричной строки. – dtb

0

Слово представляет собой 16-разрядное целое без знака (которое может хранить значения 0..65535).

Lo возвращает младший байт целого числа. Поэтому, если целое число равно 0x7B41AF, например, lo вернет 0xAF.

+0

Я знаю тех. Я не знаю: что такое эквивалентный тип данных WORD в C#? Я также ищу эквивалентную функцию LO в C#. –

+0

ОК. Я не знаю C#, но - как ответил dtb выше - тривиально реализовать функцию «lo». Действительно, чтобы получить младший байт X, просто И это с 0xFF. –

+0

UInt16 или "unsigned short" – alex

 Смежные вопросы

  • Нет связанных вопросов^_^