CRC校验原理 包括C++源码(2)

2019-01-19 18:03

【例2】计算机中常用的一种检错码是CRC,即 _A_ 码。在进行编码过程中要使用 _B_ 运算。假设使用的生成多项式是 G(X)=X4+X3+X+1,原始报文为11001010101,则编码后的报文为 _C_ 。CRC码 _D_ 的说法是正确的。

在无线电通信中常采用它规定码字长为7位.并且其中总有且仅有3个“1”。这种码的编码效率为_E_。

供选择的答案:

A:①水平垂直奇偶校验 ②循环求和 ③循环冗余 ④正比率

B:①模2除法 ②定点二进制除法 ③二-十进制除法 ④循环移位法

C:① 1100101010111 ② 110010101010011 ③ 110010101011100 ④ 110010101010101

D:①可纠正一位差错 ②可检测所有偶数位错

③可检测所有小于校验位长度的突发错 ④可检测所有小于、等于校验位长度的突发错

E:① 3/7 ② 4/7 ③ log23/log27 ④ (log235)/7 解:从前面有关CRC的论述中可得出: A:③循环冗余 B:①模2除法

C:G(x)=11011,C(x)=11001010101,C(x)*24÷G(x)=110010101010000÷11011 余0011

得到的CRC码为② 110010101010011

D:从前面有关通信与网络中常用的CRC的论述中可得出:④可检测所有小于、等于校验位长度的突发错

E:定比码又叫定重码,是奇偶校验的推广。在定比码中,奇数或偶数的性质保持不变,然而附加一种限制,每个字中1的总数是固定的。随用途之不同,定比码要求的附加校验位可能多于一个,但较之单一的奇偶校验将增加更多的检错能力。

所谓7中取3定比码,就是整个码字长度为7位,其中1的位数固定为3。所有128个7位代码(0000000~1111111)中只有1的位数固定为3的才是其合法码字。可以用求组合的公式求出其合法码字数为:C73=7!/(3!*(7-3)!)=7*6*5/(1*2*3)=35

编码效率=合法码字所需位数/码字总位数=(log235)/7 而对于CRC的实现有两种方式,分别为多项式和查表法 下面先讲讲多余多项式的实现,附代码如下

[cpp] view plain copy

1. /*

2. * 函数名:GetCrc32

3. * 函数原型:unsigned int GetCrc32(char* InStr,unsigned int len) 4. * 参数:InStr ---指向需要计算CRC32值的字符串 5. * len ---为InStr的长度 6. * 返回值为计算出来的CRC32结果。 7. *

8. * 函数名:GetCrc16

9. * 函数原型:unsigned short GetCrc16(char* InStr,unsigned int len) 10. * 参数:InStr ---指向需要计算CRC32值的字符串 11. * len ---为InStr的长度 12. * 返回值为计算出来的CRC32结果。 13. *

14. * 2009/03/26 Edit By iawen 15. * 16. */ 17.

18. unsigned int GetCrc32(char* InStr,unsigned int len){ 19. //生成Crc32的查询表

20. unsigned int Crc32Table[256]; 21. int i,j;

22. unsigned int Crc;

23. for (i = 0; i < 256; i++){ 24. Crc = i;

25. for (j = 0; j < 8; j++){ 26. if (Crc & 1)

27. Crc = (Crc >> 1) ^ 0xEDB88320; 28. else 29. Crc >>= 1; 30. }

31. Crc32Table[i] = Crc; 32. } 33.

34. //开始计算CRC32校验值 35. Crc=0xffffffff;

36. for(int i=0; i

37. Crc = (Crc >> 8) ^ Crc32Table[(Crc & 0xFF) ^ InStr[i]]; 38. } 39.

40. Crc ^= 0xFFFFFFFF; 41. return Crc; 42. } 43.

44. unsigned short GetCrc16(char* InStr,unsigned int len){

45. //生成Crc16的查询表

46. unsigned short Crc16Table[256]; 47. unsigned int i,j; 48. unsigned short Crc; 49. for (i = 0; i < 256; i++) 50. {

51. Crc = i;

52. for (j = 0; j < 8; j++) 53. {

54. if(Crc & 0x1)

55. Crc = (Crc >> 1) ^ 0xA001; 56. else 57. Crc >>= 1; 58. }

59. Crc16Table[i] = Crc; 60. } 61.

62. //开始计算CRC16校验值 63. Crc=0x0000;

64. for(i=0; i

65. Crc = (Crc >> 8) ^ Crc16Table[(Crc & 0xFF) ^ InStr[i]]; 66. 67. }

68. //Crc ^= 0x0000; 69. return Crc; 70. }

71. #include 72. using namespace std; 73.

74. int main() 75. {

76. char str[]=\; 77. unsigned int crc; 78. //crc 32校验

79. crc=GetCrc32(str,5); 80.

81. printf(\,crc); 82. //crc 16校验

83. crc=GetCrc16(str,5);//0x5359 84. //printf(\ 85. system(\); 86. return 0; 87. }


CRC校验原理 包括C++源码(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:医学化学讲稿17

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: