CRC16能不能靠一下方法获得验证码?public UInt16 CRC16Code(byte[] pcrc) 
        { 
            UInt16 crc16 = 0; 
            for (int i = 0; i < pcrc.Length; ++i) 
            { 
                crc16 = (UInt16)((crc16 << 8) ^ CRC16Table[((crc16 >> 8) ^ pcrc[i])]);
            } 
            return crc16; 
        }

解决方案 »

  1.   


    /// <summary>
            /// CRC16位校验
            /// </summary>
            /// <param name="crc_array">校验数据</param>
            /// <returns></returns>
            public uint GetCRC16(Byte[] crc_array)
            {
                uint i, j;
                uint modbus_crc;            modbus_crc = 0xffff;            for (i = 0; i < crc_array.Length - 2; i++)
                {
                    modbus_crc = (modbus_crc & 0xFF00) | ((modbus_crc & 0x00FF) ^ crc_array[i]);
                    for (j = 1; j <= 8; j++)
                    {
                        if ((modbus_crc & 0x01) == 1)
                        {
                            modbus_crc = (modbus_crc >> 1);
                            modbus_crc ^= 0XA001;
                        }
                        else
                        {
                            modbus_crc = (modbus_crc >> 1);
                        }
                    }
                }            return modbus_crc;
            }1、校验的数据是指接收到的全部数据byte[],包括最后2位校验位,你看循环把长度-2了的,
    2、返回10进制数,然后你转换成16进制,再和最后2个校验位进行比较就行了