数据校验(CRC 原理、LRC、奇偶校验、校验和)

您所在的位置:网站首页 crc校验码多项式 数据校验(CRC 原理、LRC、奇偶校验、校验和)

数据校验(CRC 原理、LRC、奇偶校验、校验和)

2023-09-23 05:10| 来源: 网络整理| 查看: 265

数据校验

  数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错。为了能够控制传输过程的差错,通信系统必须采用有效措施来控制差错的产生,并保证数据的完整性。如下所示的传输错误在这里插入图片描述

奇偶校验

  奇偶校验是检测错误的最古老的方法。用于检查数据传输的完整性。校验方法非常简单,只需要在数据上添加一个额外的位, 这个额外的位称为奇偶校验位。 该位简单地表示原数据中 1 的数量是奇数还是偶数。基本算法如下:在这里插入图片描述 通常,如果 1 的数量是奇数,则奇偶校验位是 1,如果 1 的数量是偶数,则奇偶校验位是 0。下面是一个通信流程图在这里插入图片描述   虽然奇偶校验足以保护单个字符或字节,但当应用于较大的消息时,其检测能力不足:消息通常跨越数千位,如果仅翻转两位,就无法检测到损坏。消息中出现多位错误的几率随着消息长度呈指数级增加。

当一个字符中有 1 个位不正确时(如上面的 Single-bit error),它可以检测错误,但是当字符中有 2 个错误时,它认为没有发生错误。奇偶校验会消耗大量开销(通常每 8 个位就添加一个校验位),因此它会减慢传输速度。 LRC

  纵向冗余校验(Longitudinal Redundancy Check,LRC)是一个逐字节奇偶校验计算,将数据字的所有字节一起异或,创建一个字节的结果,也称为 XOR 校验和。在这里插入图片描述 纵向冗余校验就是对奇偶校验的扩展形式。其只能检测纵向奇数个错误。在这里插入图片描述

校验和

  校验和(checksum)是指传输位数的“累加”(加法操作可能不是普通整数加法)。奇偶校验和 LRC 可以说是校验和的一种形式(严格意义上来说,他们是异或,而不是和)。将奇偶校验的思想扩展,将消息中的字节汇总成一个校验字节(而不是奇偶校验的比特位),这个字节就是校验和。在这里插入图片描述 需要注意,校验和算法有很多种(“累加”的方式不同)。

Integer Addition Checksum(整数加法校验和)

在这里插入图片描述

最高位的进位被省略可以检测使两个位变为 0 -> 1或 1 -> 0 的错误(除了高的位)无法检测补偿错误(一个位变为0 ->1,另一个位变为1 -> 0) One’s complement “checksum”

与整数校验和相同,但是要将进位加回去。在这里插入图片描述

Fletcher Checksum

Use two running one’s complement checksums

For fair comparison, each running sum is half width E.g., 16-bit Fletcher Checksum is two 8-bit running sumsInitialize: A = 0; B = 0;For each byte in data word: A = A + Bytei; B = B + A; One’s complement addition!Result is A concatenated with B (16-bit result)Significant improvement comes from the running sum B B = ByteN-1 + 2ByteN-2 + 3ByteN-3 + …Makes checksum order-dependent (switched byte order detected) Gives HD=3 until the B value rolls overFor example, 256*ByteN-256 does not affect B Adler Checksum

旨在改进 Fletcher Checksum。Adler校验和使用素数作为模数

251 instead of 255 for Adler 16 (two 8-bit sums)65521 instead of 65535 for Adler 32 (two 16-bit sums) ATN Checksum (AN/466)

Algorithm:

Initialize C0, C1, C2 and C3 to zeroFor each Data Word byte: C0 += Bytei; C1 += C0; C2 += C1; C3 += C2; (one’s complement addition, as with Fletcher checksum)32-bit check sequence is a particular formula of C0…C3 CRC

  循环冗余校验(Cyclic Redundancy Codes,CRC)试图通过增加算法的复杂性来改进校验和。与校验和一样,CRC 用于检查大块数据,而不是奇偶校验中使用的单字符检查。CRC在错误检查方面比使用校验和要有效得多。   循环冗余校验(Cyclic Redundancy Check,CRC)是数据通讯中很常用的一种校验方式。尤其是在嵌入式开发中,经常要用到 CRC 算法对各种数据进行校验。通常用法为在传输或者储存之前计算出来的数字(称为校验码)附加到原数据后面,然后接收方进行检验确定数据是否发生变化。   CRC 是数据流采用二进制除法(没有进位,使用 xor 来代替减法)相除所得到的余数,这个余数通常被称为 CRC校验码,简称 CRC 码 。其中被除数是需要计算校验和的信息数据流;除数是一个长度为 n+1 的预定义的二进制数(用多项式的系数来表示)。在做除法之前,要在信息数据之后先加上 n 个 0。当 CRC 的校验值为 n 位长时,CRC 称为 n 位CRC,通常写为 CRC-n。   CRC 由 W. Wesley Peterson 于 1961 年发明。CRC 经常被叫做“校验和”,但是这样的说法严格来说并不是准确的,因为技术上来说,校验“和”是通过加法来计算的,而不是 CRC 这里的除法。

模 2 除法

  CRC 算法中使用的除法为模 2 除法。模 2 除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或运算。模 2 除法: 假设被除数 X,除数 P,余数 R

被除数 X 除以 P,被除数首位为 1 时,商1;为 0 时,商 0 。这里与普通的算术除法不同!所得余数去除首位(左移一位): R 第一位为 0,将其作为新的被除数,除以 0,此时其首位为 0,商即为 0R 第一位为 1,将其作为新的被除数,除以 P,此时其首位为 1,商即为 1重复第 2 步直到 R 位数少于 P 位数

关于模 2 除法,有篇博文写的挺好:《 模2除法(CRC校验码计算) 》。有兴趣的可以去看看!

原理

  CRC 基于循环纠错码理论,是基于伽罗华域(Galois Field) GF(2)(即除以 2 的同余)的多项式环。简单的来说,就是所有系数都为 0 或 1 的多项式系数的集合,并且集合对于所有的代数操作都是封闭的。   在代数编码理论中,将一个码组表示为一个多项式,码组中各码元当作多项式的系数。任意一个由二进制位串组成的代码都可以和一个系数仅为 ‘0’ 和 ‘1’ 取值的多项式一一对应。例如:代码 1010111 对应的多项式为 1 * x6 + 0 * x5 + 1 * x4 + 0 * x3 + 1 * x2 + 1 * x1 + 1 * x0,即: x6 + x4 + x2 + x + 1。而多项式为 x5 + x3 + x2 + x + 1 对应的代码 101111。

G(x): 表示 CRC 的生成多项式,是接收方和发送方的一个约定,也就是一个二进制数,由 CRC 规范给定。在整个传输过程中,这个数始终保持不变。例如 CRC-16-CCITT 的生成多项式为 G(x) = x16 + x12 + x5 + 1。生成多项式应满足以下条件: ***生成多项式的最高位和最低位必须为 1(因此,大多数生成多项式的简记式中将生成多项式的最高位省略)***。当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为 0。不同位发生错误时,应该使余数不同。对余数继续做除,应使余数循环。C(x): 表示 发送的原始数据的多项式。例如 C(x) = x5 + x3 + x2 + x + 1 表示 发送的数据为 101111。R(x): 表示 CRC 码的多项式。R(x) = C(x) * (x


【本文地址】


今日新闻


推荐新闻


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