Qt计算CRC16

Modubs通信,计算CRC16校验。

/*---------------------------------------------------------
 * 函数名称: CalculateCRC
 * 函数功能: 计算Modbus RTU CRC校验
 * 输入参数: buffer, 通信数据
 * 输出参数: 无
 * 返 回 值: 转换结果, CRC校验结果
 * 计算方法:  1.初始化CRC寄存器(16位)为0xFFFF
 *           2. 把第一个8位二进制数字与CRC寄存器进行异或,并存入CRC寄存器
 *           3. 把CRC寄存器内容右移1位,用0填补高位, 并检测移除位是0 还是1
 *           4. 移除位为0, 跳过; 移除位为1, CRC = CRC & 0xA001
 *           5. 重复步骤3,4 直到右移8位
 *           6. 重复2~5,处理下一个字节数据
 *           7. 计算完成以后,计算CRC校验的高位和低位
 * -------------------------------------------------------*/
QByteArray ModbusDevice::CalculateCRC16(const QByteArray buffer)
{
    QByteArray aCRC;
    quint16 crc = 0xFFFF;

    for(int j=0; j<buffer.size(); j++)
    {
        quint8 data = static_cast<quint8>(buffer.at(j));

        crc = crc^data;

        //数据需要右移8次
        for(int i=0; i < 8; i++)
        {
            if(crc & 0x01)
            {
                crc = (crc >> 1);
                crc ^= 0xA001;
            }
            else
            {
                crc = (crc >> 1);
            }
        }
    }

    aCRC.append(static_cast<char>(crc&0xFF));
    aCRC.append(static_cast<char>((crc>>8)&0xFF));

    return aCRC;
}