将CRC-CCITT KERMIT 16 DELPHI代码转换为C#
题
我正在研究一个功能,该功能将为我提供十六进制字符串的Kermit 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的Kermit CRC
我猜Delphi功能是正确的。如果有人可以将代码转换为C#,那将是很棒的。我尝试转换为C#,但在Word Data类型和Delphi的LO函数中迷失了。谢谢你们。
解决方案
从 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);
}
采用 conding.ascii.getBytes(string) 转换 string
到 byte[]
.
其他提示
一个单词是一个16位的无符号整数(可以存储值0..65535)。
LO返回整数的低阶字节。因此,如果整数为0x7b41af,则LO将返回0xAF。
不隶属于 StackOverflow