公司要做个项目,用到crc算法(C#实现),我找了好多资料都没什么进展,希望大家能帮帮我哦 谢谢了先
校验步骤:
1,装一个16位寄存器,所有数位均为1
2,娶被校验串的一个字节与16位寄存器的高位字节进行“异或”运算。运算结果放入这个16位寄存器
3,把这个16位寄存器向右移一位
4,若向右(标记位)移出的数位式1,则生成多项式1010 0000 0000 0001 和这个寄存器进行“异或”运算;若右移出的数位是0,则返回步骤3
5,重复步骤3和4,直至移出8位
6,取被校验串的下一个字节
7,重复步骤3-6,直至被校验串的所有字节均与16位寄存器进行“异或”运算,并移位8次
8,这个16位寄存器的内容即2字节crc错误校验码 
这个事HJ/T212-2005污染源在线自动监控(检测)系统数据传输标准中用到的,希望大家帮帮我呀,我的前途可就在各位手上咯

解决方案 »

  1.   

    倒,整个流程/步骤都有了..照单直译就行了.1 : WORD reg = 0xFFFF;
    2 : WORD tmp = GetByte() ^ ( BYTE )( reg >> 8 )
    3 : ..
    4 : .
    5
    6
    7
    8慢慢写啦~~
      

  2.   

    //看看是不是你要的,VC++算法
    BOOL CRC_CHECK(unsigned char buffer[MAX_DATA_LEN],int len)
    {
    int i,j;
    WORD ch,crc=0;
    for( i=0;i<len-2;i++) //校验前面所有的字节的crc
    { ch = (unsigned char)buffer[i];
            ch=(ch<<8);
            for(j=0;j<8;j++)
            {   if(((ch^crc) & 0x8000)!=0)
                {   crc^=0x6815;
                }
                ch=(ch<<1);
                crc=(crc<<1);
            }
        }
    if( (crc>>8==buffer[len-2]) && (crc & 0X00FF)==buffer[len-1])
    return TRUE; return FALSE;
    }
      

  3.   

    void GetCRC(BYTE *buf, int nLength)  //buf是多项式,nLength是多项式长度
    {
    int i, j; 
    DWORD  current_crc_value = PRESET_VALUE;

    for(i = 0; i < nLength; i++)  /*len=number of protocol bytes without CRC*/ 

    current_crc_value = current_crc_value ^ ((unsigned int)buf[i]); 
    for(j = 0; j < 8; j++) 

    if(current_crc_value & 0x0001) 

    current_crc_value = (current_crc_value >> 1) ^ POLYNOMIAL; 

    else 

    current_crc_value = (current_crc_value >> 1); 



    buf[nLength] = (BYTE)(current_crc_value & 0x00ff); 
    buf[nLength + 1] = (BYTE)((current_crc_value >> 8) & 0x00ff); 
    }
      

  4.   

    弱弱的问下 c#和c/c++ 应该不一样吧
    我不是很懂这些耶 谢谢楼上几个先 
      

  5.   

    http://blog.csdn.net/DavidHsing/archive/2009/05/14/4184240.aspx
    有点 CRC 的内容,不过是 C++ 的。
    C# 版的 CRCR 网上多的是