CRC 校验值计算

您所在的位置:网站首页 crc校验码生成程序 CRC 校验值计算

CRC 校验值计算

2023-03-21 02:25| 来源: 网络整理| 查看: 265

CRC 校验值计算

简单明确一下概念, CRC(Cyclic Redundancy Check) 是一个校验算法, 而我们常说的 CRC32 校验值指的其实是冗余码. 其中 “32” 指的是冗余码的长度为 32 位.

简单计算原理

首先我们预定义了一个除数 P, 在 CRC 中又叫生成多项式.

假设 P = 1101 P = 1101 P=1101.

第一步把 数据 分成组, 假设每组 k 个比特, 假设 数据 为 M.

M = 101001 ( k = 6 ) M = 101001 \quad (k = 6) M=101001(k=6)

第二步假设我们需要在 数据 M 的 n 位冗余码. (则 除数 P 的长度需要为 (n + 1) 位)

n 位冗余码的计算

先对 数据 M 乘 2 n 2^n 2n, 用伪代码表示即:

M = M uint8_t tb = b; for (uint8_t i = 0x01, p = 0x80; i != 0x10; i = 1) { if (!(tb & i) ^ !(tb & p)) { tb ^= i; tb ^= p; } } return tb; }; // 从 data 加载一个字节到 R 的低 8 位的过程. auto Load_byte = [&]() -> bool { if (data_index if (!Load_byte()) { break; } R R for (uint32_t i = 0; i R = ~R; } return (uint32_t)R; } int main(int argn, char** argc) { unsigned char test_data[] = { 0x45, 0x04, 0x05, 0xdc, 0x5a, 0x5a, 0x40, 0x00, 0x2e, 0x06, 0x00, 0x00, 0xac, 0xf5, 0x11, 0x28, 0xac, 0x15, 0x9d, 0x7d, //数据后加冗余码再次进行CRC计算必得0 }; // F1526A3F if (argn > 1) { fstream f(argc[1], fstream::in | fstream::binary); uint64_t file_size; vector data; uint32_t crc32 = 0; if (f.fail()) { cout


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3