CRC检查(16位),

2025-02-03 19:04:07122 次浏览

最佳答案

你理解错了。

CRC 基本定义:

设【要传送的信息】中,【原文字段】为K位,【校验字段】为R位,那么要传送的信息一共长度为 N=K+R 位。

设要发送的信息为 v(x),原文为 m(x),校验字段为 r(x),那么:

v(x) = x^R m(x) + r(x) = g(x)

m(x) 容易知道,就是原文的二进制形式。

r(x) 的计算方式:设有一个R次多项式g(x),也即是生成函数,和 m(x)进行重复异或操作,最终得到一个R次多项式,就是 r(x)。

------------------------------------------------------------------------------------------------------

下面来看你的问题:

根据你的描述,可以知道以下事实:

1)原文 m(x) :即数组 Buf[1]~Buf[16],一共 16 个字节,16*8 = 128 位。

2)校验码 r(x):即数组 Buf[17]~Buf[18],一共 2 个字节,2*8 = 16 位。

3)生成函数 g(x):X16 + X15 + X2 + 1,这里 R=16,也即 g(x) 是 16次多项式。

4)题目中的描述:

Buf[17]=Buf[1]~Buf[16] CRC code (calculation:X16 + X15 + X2 + 1)HIGH BYTE

Buf[18]=Buf[1]~Buf[16] CRC code (calculation:X16 + X15 + X2 + 1)LOW BYTE

描述的是根据 g(x),计算 r(x) 的算法。

具体的说,是根据:

原文 :Buf[1]~Buf[16],

以及生成函数: X16 + X15 + X2 + 1,

得到校验码:Buf[17]~Buf[18]。

计算 r(x) 算法为:

已知 Buf[1]~Buf[16] 一共 8 个字节,设一个 128 位组成的序列为:

m(x) = f128 * X128 + f127 * X127 + ... + f3 * X3 + f2 * X2 + f1

其中系数 f127 ~ f1 取值只能为 0 或者 1,具体是值由 Buf[1]~Buf[16] 的相应位决定。比如:

f127 就是 Buf[1] 的最高位,f1 就是 Buf[16] 的最低位。

已知g(x):X16 + X15 + X2 + 1 ,用 g(x) 和 m(x) 异或,得到一个结果 t(x)。如果 t(x) 是大于 16 次的多项式(也就是 t(x) 的最高位大于 X16 ),那么继续用 g(x) 和 t(x) 异或,得到新的 t(x)。直到 t(x) 是一个小于 16 次的多项式为止。这个 t(x) 就是要求的 r(x)。

声明:知趣百科所有作品均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请在页面底部查找“联系我们”的链接,并通过该渠道与我们取得联系以便进一步处理。