Convertir código CRC-CCITT Kermit 16 DELPHI a C #
Pregunta
Estoy trabajando en una función que me dará un valor Kermit CRC de una cadena hexadecimal. Tengo un pedazo de código en Delphi. Soy un desarrollador de .NET y necesito el código en 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;
Tengo el código de la página: Kermit CRC en DELPHI
supongo que la función de Delphi es correcta. Si cualquiera puede complacer a convertir el código C # que será grande. He intentado convertir a C #, pero se perdió en el tipo de datos WORD y la función LO de Delphi. Gracias a todos.
Solución
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 < a href = "http://msdn.microsoft.com/en-us/library/system.text.encoding.getbytes.aspx" rel = "nofollow noreferrer">. GetBytes (cadena) para convertir una string
a un byte[]
.
Otros consejos
Una palabra es un entero sin signo de 16 bits (que puede almacenar los valores 0..65535).
Lo devuelve el byte de orden bajo de un número entero. Así que si el entero es 0x7B41AF, por ejemplo, lo devolverá 0xAF.