CRC16的校验算法,怎么将C++转换为C#

CRC16的校验算法,如何将C++转换为C#?
校验算法应采用CRC16方式,其生成多项式见下式,算法参考代码参见如下:
 

unsigned short CalcCrc16(unsigned char * pData, int nLength)
{
unsigned short cRc_16 = 0x0000;    // 初始化
const unsigned short cnCRC_16 = 0x8005;
unsigned long cRctable_16[256];
unsigned short i,j,k;

for (i=0,k=0;i<256;i++,k++)
{
cRc_16 = i<<8;
for (j=8;j>0;j--)
{
if (cRc_16&0x8000) //反转时cRc_16&0x0001
cRc_16 = (cRc_16<<=1)^cnCRC_16; //反转时cRc_16=(cRc_16>>=1)^gEnpoly
else
cRc_16<<=1; //反转时cRc_16>>=1
}
cRctable_16[k] = cRc_16;
}
 
while (nLength>0)
{
cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ *pData) & 0xff]; 
nLength--;
pData++;
}
 
return cRc_16; 



另外协议中规定,第5和6,2个字节为校验和。校验前Body的内容已经被加密过,校验前的初始值为0x0000。
校验时计算从第一个字节到最后一个字节。
如果报文如下:
5A 01 29 00 53 25 FF 33 35 39 32 33 31 30 33 30 31 30 39 32 39 30 2A 47 53 46 54 32 30 31 34 30 32 31 38 30 30 30 31 67 73 66 74 47 53 46 54 00 02 77 
也就是说,53 25和校验和,5A到77都为需要校验的报文

如何将这个代码,转换成C#以及匹配检验呢?

------解决方案--------------------
除了处理下指针,用数组表示,别的C++和C#都一样写。

具体你就自己写了。对照着调试,如果有不符合再问。
------解决方案--------------------
QQ:8150772 ,     加我, 发给你, 写CRC-16
------解决方案--------------------
我之前用的这个


  #region CRC16校验


        /// <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
    }

------解决方案--------------------
如果你的C++的CRC校验代码是对的,转换成C#如下

ushort CalcCrc16(byte[] pData, int nLength)
{
    ushort cRc_16 = 0x0000;    // 初始化
    const ushort cnCRC_16 = 0x8005;
    uint[] cRctable_16=new uint[256];