【例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 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. }