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
相关产品推荐
相关产品推荐

