【QT】CRC64-ECMA-182相关教程

📅 发布时间:2026/7/7 13:57:08 👁️ 浏览次数:
【QT】CRC64-ECMA-182相关教程
一、CRC64的概念CRC循环冗余校验是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的算法主要用于检测数据在传输或存储过程中可能发生的错误。CRC64 是 CRC 算法的 64 位版本它生成的校验值长度为 64 位8 字节。特点检错能力强64 位空间使得碰撞概率极低适用于对数据完整性要求极高的场景如大型文件校验、数据存储一致性检查等。相比较短位数的 CRC如 CRC32CRC64 提供更高的错误检测能力。算法高效通过查表法可实现高速计算适合处理大块数据如 QByteArray。**标准多样**存在多种 CRC64 标准如 ECMA-182、ISO 3309 等区别在于生成多项式、初始值、结果异或值等参数使用时需明确所选标准。二、CRC64 算法原理CRC 算法的核心是模二多项式除法。将待校验的数据视为一个大的二进制多项式即把每个字节的每一位看作多项式的系数除以一个预先选定的生成多项式generator polynomial得到的余数即为 CRC 值。CRC64 的生成多项式是 64 阶的通常表示为十六进制数最高位固定为 1隐含表示。一个完整的 CRC64 算法需要以下参数生成多项式Polynomial如 0x42F0E1EBA9EA3693ECMA-182 标准。初始值Initial Value计算开始时寄存器的初值通常为 0x0000000000000000 或 0xFFFFFFFFFFFFFFFF。结果异或值XOR-out计算完成后与寄存器的值进行异或常见为 0x0000000000000000 或 0xFFFFFFFFFFFFFFFF。输入反转Reflect In是否将每个字节的比特顺序反转后再处理。输出反转Reflect Out是否将最终寄存器的比特顺序反转后再输出。不同标准的参数组合不同计算时必须保持一致。三、常见 CRC64 标准标准名称生成多项式初始值结果异或值输入反转输出反转ECMA-1820x42F0E1EBA9EA36930x00000000000000000x0000000000000000否否ISO 3309 (CRC-64)0x000000000000001B (实际为64位此处简化)----实际中最常用的是ECMA-182 标准例如XZ压缩工具使用的是CRC64 就是该标准。四、在 Qt 中计算 QByteArray 的 CRC64 值下面给出基于查表法的实现支持 ECMA-182 标准可直接用于 QByteArray的CRC64 的计算。1.查表法原理预先计算所有可能的 8 位输入0~255对应的 CRC64 中间值存储在一个 256 个元素的表中。计算时依次处理每个字节利用查表和异或操作快速更新寄存器值。/*功能生成CRC64的表格*/voidCRC64_ECMA182::generateCRC64Table(){constquint64 poly0x42F0E1EBA9EA3693ULL;for(inti0;i256;i){quint64 crc(quint64)i56;for(intj0;j8;j){if(crc(1ULL63)){crc(crc1)^poly;}else{crc1;}}m_crc64Table[i]crc;}}/*功能计算输入的data的CRC64的值*/quint64CRC64_ECMA182::CalculateCrc64(constQByteArraydata){quint64 crc0;for(inti0;idata.size();i){quint8 bytestatic_castquint8(data[i]);// MSB first不需要输入反转// 取CRC的高8位与当前字节异或quint8 index(crc56)^byte;crc(crc8)^m_crc64Table[index];}//qDebug()MSBCalculateCrc calculate2:data.size(),QString::number(crc, 16).toUpper();returncrc;}根据以上算法计算的结果和网站上计算的一致相关链接CRC64计算器网站