当前位置: 代码迷 >> C# >> 关于CRC16校码解决方案
  详细解决方案

关于CRC16校码解决方案

热度:129   发布时间:2016-05-05 04:43:52.0
关于CRC16校码
哪位大侠帮忙把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

这个帖子是我以前的你看下有没有帮助...
  相关解决方案