You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt的qChecksum采用什么算法?C#如何实现同等校验功能?

Qt qChecksum 功能C#实现方案

算法说明

  • Qt 官方qChecksum函数采用CRC-16-CCITT校验算法,核心参数配置与官方源码逻辑完全对齐:
    • 初始值:0xFFFF
    • 校验多项式:0x1021
    • 输出类型:16位无符号整数(quint16)

C# 实现代码

1. 等价qChecksum校验计算

/// <summary>
/// 计算与Qt qChecksum完全一致的CRC16校验值
/// </summary>
/// <param name="data">输入字节数组</param>
/// <returns>16位校验结果</returns>
public static ushort QtChecksum(byte[] data)
{
    ushort crc = 0xFFFF;
    const ushort polynomial = 0x1021;

    foreach (byte b in data)
    {
        crc ^= (ushort)(b << 8);
        for (int i = 0; i < 8; i++)
        {
            if ((crc & 0x8000) != 0)
            {
                crc = (ushort)((crc << 1) ^ polynomial);
            }
            else
            {
                crc <<= 1;
            }
        }
    }
    return crc;
}

2. 序列化与测试验证

对应你给出的测试用例,配合QDataStream序列化逻辑的验证代码如下:

// 测试输入
string plaintext = "2";
// 注意:此处编码需和Qt端QByteArray的字符串编码保持一致,默认用Latin1
byte[] inputBytes = System.Text.Encoding.Latin1.GetBytes(plaintext);

// 计算校验值
ushort checksum = QtChecksum(inputBytes);

// 等价于QDataStream写入quint16的逻辑,默认小端序输出
byte[] outputBytes = BitConverter.GetBytes(checksum);
// 若Qt端设置了大端序,需反转字节数组:Array.Reverse(outputBytes);

// 转字符串验证结果,和你预期的"âé"一致
string result = System.Text.Encoding.Latin1.GetString(outputBytes);

注意事项

  • 输入字符串的编码必须和Qt端生成QByteArray时的编码完全对齐,避免输入字节序列差异导致校验值不匹配
  • 若Qt端手动修改了QDataStream的字节序,C#端需对应调整输出字节的顺序

内容的提问来源于stack exchange,提问作者Cluutch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 04:45:00