数据校验(CRC 原理、LRC、奇偶校验、校验和) |
您所在的位置:网站首页 › crc校验码多项式 › 数据校验(CRC 原理、LRC、奇偶校验、校验和) |
数据校验
数据在传输的过程中,会受到各种干扰的影响,如脉冲干扰,随机噪声干扰和人为干扰等,这会使数据产生差错。为了能够控制传输过程的差错,通信系统必须采用有效措施来控制差错的产生,并保证数据的完整性。如下所示的传输错误 奇偶校验是检测错误的最古老的方法。用于检查数据传输的完整性。校验方法非常简单,只需要在数据上添加一个额外的位, 这个额外的位称为奇偶校验位。 该位简单地表示原数据中 1 的数量是奇数还是偶数。基本算法如下: 纵向冗余校验(Longitudinal Redundancy Check,LRC)是一个逐字节奇偶校验计算,将数据字的所有字节一起异或,创建一个字节的结果,也称为 XOR 校验和。 校验和(checksum)是指传输位数的“累加”(加法操作可能不是普通整数加法)。奇偶校验和 LRC 可以说是校验和的一种形式(严格意义上来说,他们是异或,而不是和)。将奇偶校验的思想扩展,将消息中的字节汇总成一个校验字节(而不是奇偶校验的比特位),这个字节就是校验和。 与整数校验和相同,但是要将进位加回去。 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 |