beiklive's blog beiklive's blog
首页
  • 语言学习

    • C/C++
    • Python
    • Qt
  • 系统&引擎

    • Linux
    • Godot
  • 啥都学

    • 夏姬八学
    • 好好学习
  • 折腾记录

    • 树莓派
    • Obsidian
    • 实践记录
  • 技术文档
  • 工具网站
  • Github项目
  • 友情链接
  • 关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

beiklive

全沾艺人
首页
  • 语言学习

    • C/C++
    • Python
    • Qt
  • 系统&引擎

    • Linux
    • Godot
  • 啥都学

    • 夏姬八学
    • 好好学习
  • 折腾记录

    • 树莓派
    • Obsidian
    • 实践记录
  • 技术文档
  • 工具网站
  • Github项目
  • 友情链接
  • 关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • CRC校验
    • CRC校验算法简介
      • 什么是CRC校验?
      • CRC校验的原理
      • CRC校验的应用
      • CRC校验的类别
      • CRC-8
      • CRC-16
      • CRC-32
      • CRC-64
      • 各种CRC校验的应用场景
      • CRC校验的步骤
      • CRC-16 示例代码
  • 自动获取github的hosts并更新本地host文件
  • 配置指定IP 走指定网关
  • wireshark 抓取指定程序
  • 使用Git Action自动初始化Gitalk评论
  • Note_Other
beiklive
2024-05-15
目录

CRC校验

# CRC校验算法简介

# 什么是CRC校验?

CRC(Cyclic Redundancy Check,循环冗余校验)是一种常用的数据校验算法,用于检测数据在传输过程中是否发生了错误。它基于多项式运算,通过对数据进行计算生成一个校验码,发送方将这个校验码附加在数据后一起发送,接收方根据相同的算法对接收到的数据进行校验,然后与接收到的校验码进行比较,以确定数据的完整性和准确性。

# CRC校验的原理

CRC校验是基于除法的运算。假设有一段数据D,我们要生成一个n位的校验码C,使得 ( D \times 2^n ) 除以一个预定的生成多项式G的结果的余数等于C。接收方在收到数据D和校验码C后,也利用相同的生成多项式G进行运算,然后比较接收到的校验码与计算得到的校验码,以验证数据的正确性。

# CRC校验的应用

  1. 数据传输:常用于网络通信、串口通信等数据传输过程中,确保数据的准确性和完整性。
  2. 存储设备:在磁盘、闪存等存储设备中,用于检测数据的读写过程中是否出现错误。
  3. 通信协议:在许多通信协议中,如Ethernet、USB、ZIP等,CRC校验被广泛应用来保证通信的可靠性。

# CRC校验的类别

CRC校验根据生成多项式的不同,分为多种不同的类别。常见的CRC类别包括CRC-8、CRC-16、CRC-32、CRC-64等。每种类别的多项式和长度不同,适用于不同的应用场景。

# CRC-8

CRC-8 使用8位生成多项式,常用于简单的校验场合,如小数据包的校验。常见的生成多项式是 x^8 + x^2 + x + 1,也可以表示为0x07。

# CRC-16

CRC-16 使用16位生成多项式,广泛应用于工业控制、通信协议等领域。常见的生成多项式包括:

  • CRC-16-IBM(常用): x^16 + x^15 + x^2 + 1,也可以表示为0x8005。
  • CRC-16-CCITT: x^16 + x^12 + x^5 + 1,也可以表示为0x1021。

# CRC-32

CRC-32 使用32位生成多项式,是最常见的一种CRC校验,应用于以太网、文件压缩(如ZIP和RAR)等领域。常见的生成多项式是 x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1,也可以表示为0x04C11DB7。

# CRC-64

CRC-64 使用64位生成多项式,用于需要高可靠性校验的场合。常见的生成多项式是 x^64 + x^4 + x^3 + x + 1,也可以表示为0x42F0E1EBA9EA3693。

# 各种CRC校验的应用场景

  1. CRC-8:适用于简单的、对数据校验精度要求不高的场景,如某些嵌入式系统中的数据校验。
  2. CRC-16:广泛应用于工业控制、串口通信、Modbus协议等领域,确保数据传输的准确性。
  3. CRC-32:应用于网络通信(如以太网)、文件压缩和存储等需要较高数据完整性的场合。
  4. CRC-64:主要用于需要高可靠性和高精度的数据校验场合,如高性能计算和数据存储系统。

# CRC校验的步骤

  1. 选择生成多项式G:根据应用场景选择一个适合的生成多项式,常用的生成多项式有CRC-8、CRC-16、CRC-32等。
  2. 初始化:将CRC寄存器初始化为全1。
  3. 数据处理:逐位处理数据,将数据与CRC寄存器进行异或操作,并进行左移位运算。
  4. 最终处理:对CRC寄存器的最终值进行取反操作,得到最终的CRC校验码。

# CRC-16 示例代码

下面是一个简单的C++示例代码,展示了如何计算CRC-16校验码的过程:

#include <iostream>

// CRC-16生成多项式
const uint16_t CRC16_POLY = 0x8005;

// 计算CRC-16校验码
uint16_t calculateCRC16(const uint8_t* data, size_t length) {
    uint16_t crc = 0xFFFF;

    for (size_t i = 0; i < length; ++i) {
        crc ^= (static_cast<uint16_t>(data[i]) << 8);

        for (int j = 0; j < 8; ++j) {
            if (crc & 0x8000) {
                crc = (crc << 1) ^ CRC16_POLY;
            } else {
                crc <<= 1;
            }
        }
    }

    return crc;
}


// CRC-32生成多项式
const uint32_t CRC32_POLY = 0x04C11DB7;

// 计算CRC-32校验码
uint32_t calculateCRC32(const uint8_t* data, size_t length) {
    uint32_t crc = 0xFFFFFFFF;

    for (size_t i = 0; i < length; ++i) {
        crc ^= (static_cast<uint32_t>(data[i]) << 24);

        for (int j = 0; j < 8; ++j) {
            if (crc & 0x80000000) {
                crc = (crc << 1) ^ CRC32_POLY;
            } else {
                crc <<= 1;
            }
        }
    }

    return crc ^ 0xFFFFFFFF;
}


int main() {
    uint8_t testData[] = {0x01, 0x02, 0x03};
    size_t testDataLength = sizeof(testData) / sizeof(testData[0]);

    uint16_t crc16 = calculateCRC16(testData, testDataLength);
    std::cout << "CRC-16校验码为: 0x" << std::hex << crc16 << std::endl;

    uint32_t crc32 = calculateCRC32(testData, testDataLength);
    std::cout << "CRC-32校验码为: 0x" << std::hex << crc32 << std::endl;

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

以上示例中,我们定义了一个函数 calculateCRC16 来计算CRC-16校验码,然后在 main 函数中调用这个函数对测试数据进行校验。

编辑 (opens new window)
#CRC#校验
上次更新: 2024/05/22, 14:11:38
自动获取github的hosts并更新本地host文件

自动获取github的hosts并更新本地host文件→

最近更新
01
爬虫技术与法律风险:个人开发者的注意事项
05-22
02
个人开发者的抉择:个人工作室 vs 公司主体 🤔
05-22
03
《计算机网络,自顶向下方法》笔记(一)
05-20
更多文章>
Theme by Vdoing | Copyright © 2024-2024 beiklive | 苏ICP备20038092号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式