记录一下,CRC计算的方法,防止遗忘,以USB中CRC5计算为例。
xxxxxxxxB 说明xxxxxxxx是二进制数。
USB中CRC5的使用主要用于令牌包Setup,Out,In的CRC区域。CRC保护的数据段为非PID的数据段,
在如图所示的数据包类型里,即地址段。
假设有一个Setup包的地址区域,设备地址为0x20,端点为4,那么它的bit序(lsb在前)为00000100010B记为A。
0000000B,CRC5的生成多项式为G(X)= X^5 + X^2 + 1,它所对应的二进制表示为100101B。
开始计算CRC的被除数。A左移五位,低位补0。加上一个系数全1的4(生成多项式的阶数 - 1)阶多项式的二进制表示,此处为1111 1000 0000 0000B,从而得到被除数为1111 1100 0100 0000B。
开始用被除数模2除以生成多项式的二进制表示,模2除即异或运算,详细可以百度下。
这里即1111 1100 0100 0000B除以100101B,得到的余数的首部为0,则左移一位;如果首部为1,则除以100101B;直到余数小于除数100101B,再对此刻得到的余数按位求反,即为最终的CRC检验数,五个bit。
有些软件抓包比如说最后的CRC位计算为01000B,但是软件是会按MSB在前来显示数据,所以就会变成00010,软件会自己补齐低位的0,变为0x10