将CRC-CCITT Kermit 16 DELPHI代码转换为C#

将CRC-CCITT Kermit 16 DELPHI代码转换为C#,c#,delphi,crc,kermit,C#,Delphi,Crc,Kermit,我正在处理一个函数,它将从十六进制字符串中给我一个Kermit CRC值。我有一段DELPHI代码。我是一名.NET开发人员,需要C语言的代码 我从这个网页获得了代码: 我想Delphi函数是正确的。如果有人能把代码转换成C,那就太好了。我试图转换为C#,但在WORD数据类型和Delphi的LO函数中迷失了方向。谢谢大家。发件人: 静态长计算CRC(字节[]val) { 长crc; 长q; 字节c; crc=0; 对于(int i=0;i>4)^(q*0x1081); q=(crc^(c>>4)

我正在处理一个函数,它将从十六进制字符串中给我一个Kermit CRC值。我有一段DELPHI代码。我是一名.NET开发人员,需要C语言的代码

我从这个网页获得了代码:

我想Delphi函数是正确的。如果有人能把代码转换成C,那就太好了。我试图转换为C#,但在WORD数据类型和Delphi的LO函数中迷失了方向。谢谢大家。

发件人:

静态长计算CRC(字节[]val)
{
长crc;
长q;
字节c;
crc=0;
对于(int i=0;i>4)^(q*0x1081);
q=(crc^(c>>4))&0xf;
crc=(crc>>4)^(q*0x1081);
}
返回(字节)crc>8);
}

用于将
字符串
转换为
字节[]
一个字是一个16位无符号整数(它可以存储值0..65535)


Lo返回整数的低位字节。因此,例如,如果整数是0x7B41AF,lo将返回0xAF。

在Delphi中,函数应该真正定义为
函数CRC_16(const cadena:string):word。是的!它的正确率为95%。这是我用作参考的URL:-对于URL给出的十六进制字符串“absdef”(KERMIT)=0x5A43,但上面的代码给出的是=435A。因此,第一个和最后两个字母/数字被交换。我现在所做的就是=stringresult=crc.ToString(“X”);result=result.Substring(2,2)+result.Substring(0,2);我需要字符串中的结果,所以它现在可以正常工作。谢谢我会接受这个答案,即使你不张贴到固定交换2个字母的问题。没什么大不了的,它成功了,我很高兴。严重的问题:对于HexString=ACA1F0FE00000000,kermitcrc=8602。上述代码给出=286。现在,我无法使用上述注释的方法将286翻译为8602。@Mehdi Anis:我已更新了答案以交换字节。它现在返回0x8602作为十六进制字符串。我知道这些。我不知道:C#中WORD的等效数据类型是什么?我也在寻找C#中的等效LO函数。好的。我不知道C#,但正如dtb在上面回答的那样,实现“lo”函数很简单。实际上,要获得X的低阶字节,只需将其与0xFF相加。
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;
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);
}