哪位大侠帮忙把delphi的CRC16 的生成代码,转成 C#的。
以下是 delphi的代码:
===========================================
// 注 CRCtbl 太长,这里只截一部分贴了。
CRCtbl : array [0..255] of word =
(
$0000, $C0C1, $C181, $0140, $C301, $03C0, $0280, $C241,
$C601, $06C0, $0780, $C741, $0500, $C5C1, $C481, $0440,
$CC01, $0CC0, $0D80, $CD41, $0F00, $CFC1, $CE81, $0E40,
$0A00, $CAC1, $CB81, $0B40, $C901, $09C0, $0880, $C841,
$D801, $18C0, $1980, $D941, $1B00, $DBC1, $DA81, $1A40
)
function CalcCrc(length:byte;data:array of byte): word; //stdcall;
var
crc:word ;
dzp1: ^byte;
begin
crc:=$ffff;
dzp1:[email protected];
while(length>0)
do
begin
crc:= (crc shr 8) xor CRCtbl[(crc xor dzp1^) and $ff];
length:=Length-1;
inc(dzp1);
end;
result:=crc;
end;
------解决思路----------------------
/// <summary>
///CRC16校验算法,(低字节在前,高字节在后)
/// </summary>
/// <param name="data">要校验的数组</param>
/// <returns>返回校验结果,低字节在前,高字节在后</returns>
public static byte[] crc16(byte[] data)
{
if (data.Length == 0)
throw new Exception("调用CRC16校验算法,(低字节在前,高字节在后)时发生异常,异常信息:被校验的数组长度为0。");
byte[] temdata = new byte[data.Length + 2];
int xda, xdapoly;
byte i, j, xdabit;
xda = 0xFFFF;
xdapoly = 0xA001;
for (i = 0; i < data.Length; i++)
{
xda ^= data[i];
for (j = 0; j < 8; j++)
{
xdabit = (byte)(xda & 0x01);
xda >>= 1;
if (xdabit == 1)
xda ^= xdapoly;
}
}
temdata = new byte[2] { (byte)(xda & 0xFF), (byte)(xda >> 8) };
return temdata;
}
#endregion
}
用这个试试。
------解决思路----------------------
http://bbs.csdn.net/topics/390869983
这个帖子是我以前的你看下有没有帮助...