具体算法如下:
CRC 是先调入一值是全“1”的16 位寄存器,然后调用一过程将消息中连续的8 位字
节各当前寄存器中的值进行处理。仅每个字符中的8Bit 数据对CRC 有效,起始位和停止位
以及奇偶校验位均无效。
CRC 校验字节的生成步骤如下:
① 装一个 16 位寄存器,所有数位均为1。
② 取被校验串的一个字节与16 位寄存器的高位字节进行“异或”运算。运算结果放
入这个16 位寄存器。
③ 把这个 16 寄存器向右移一位。
④ 若向右(标记位)移出的数位是1,则生成多项式1010 0000 0000 0001 和这个寄
存器进行“异或”运算;若向右移出的数位是0,则返回③。
⑤ 重复③和④,直至移出 8 位。
⑥ 取被校验串的下一个字节
⑦ 重复③~⑥,直至被校验串的所有字节均与16 位寄存器进行“异或”运算,并移位
8 次。
⑧ 这个 16 位寄存器的内容即2 字节CRC 错误校验码。
校验码按照先高字节后低字节的顺序存放。
求大虾按照上面的要求,写给我一个CRC算法,  测试结果 1234得到“BA30”

解决方案 »

  1.   

    public long GetModBusCRC(string DATA)
            {
                long functionReturnValue = 0;            long i = 0;
                long J = 0;
                byte[] v = null;
                v = strToToHexByte(DATA);
              
                //1.预置1个16位的寄存器为十六进制FFFF(即全为1):称此寄存器为CRC寄存器;
                long CRC = 0;
                CRC = 0xffff;
                for (i = 0; i <= (v).Length - 1; i++)
                {
                    //2.把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低8位相异或,把结果放于CRC寄存器;
    //他第二步是低8位,而我要的是高位字,这该怎么改
                    CRC = (CRC / 256) * 256 + (CRC % 256) ^ v[i];//这行不懂
                    for (J = 0; J <= 7; J++)
                    {
                        //3.把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查最低位;
                        //4.如果最低位为0:重复第3步(再次右移一位);
                        // 如果最低位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
                        //5.重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
                        long d0 = 0;
                        d0 = CRC & 1L;
                        CRC = CRC / 2;
                        if (d0 == 1)
                            CRC = CRC ^ 0xa001;                }                //6.重复步骤2到步骤5,进行通讯信息帧下一字节的处理;
                }            //7.最后得到的CRC寄存器内容即为:CRC码。
                CRC = CRC % 65536;
                functionReturnValue = CRC;
                return functionReturnValue;
            }