校验码:奇偶校验,汉明码,CRC循环冗余校验码

2024-02-12 01:48

本文主要是介绍校验码:奇偶校验,汉明码,CRC循环冗余校验码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



链接:http://blog.csdn.net/matrix_laboratory/article/details/12858049


大多数情况下,使用检错码,查错后请求重发;

只有在单工信道(没有反向反馈),才使用纠错功能


1. 奇偶校验

1.1 原理

有效数据:data_code

msg = data_code + check_code   

check_code一般是1位,使msg中“1”的个数为偶数(或奇数)

1.2 分类

水平校验:只检不纠

垂直校验:只检不纠

水平垂直校验:只能纠正1位错,(互补的错不行)



2. 海明码

2.1 海明距离(HD)

海明距离(HD):两个码字的对应比特取值不同的比特数

检d个位查错:HD >= d + 1   (至少有一码代表无效)

纠d个位查错:HD >= 2d + 1   

2.2 原理

发送端在 k 比特信息上附加 r 比特冗余信息(即校验比特),构成 n=k+r 比特的码字,且满足条件:2^r≥n+1,即 2^r≥k+r+1。其中,每个校验比特和某几个特定的信息比特构成偶校验的关系。

eg:

P1 P2 D3P4D5D6D7P8D9D10D11
             其中,P1、P2、P4、P8 为插入的校验比特,D3D5D6D7D9D10D11 为原来ASCII码的信息比特。

如果把各信息比特的下标写成 2 的幂次之和,即下标3=1+2,5=1+4,6=2+4,7=1+2+4,9=1+8,10=2+8,11=1+2+8,这表示:信息比特 D3 要参与校验比特 P1、P2 的生成、信息比特 D5 要参与校验比特 P1、P4 的生成,……,等等。
            则各校验比特由下式决定: 
                P1 = D3+D5+D7+D9+D11       
                P2 = D3+D6+D7+D10+D11
                P4 = D5+D6+D7
                P8 = D9+D10+D11    

          S1 = P1+D3+D5+D7+D9+D11     
          S2 = P2+D3+D6+D7+D10+D11
          S4 = P4+D5+D6+D7
          S8 = P8+D9+D10+D11

if  S1= S2 = S4 = S8 = 0, 则无错;
else  有错.
 错误位置在 S= S8 S4 S2 S1 处,


 ‘A’的 ASCII 码为1000001, 由于海明码为 
               P1P2D3P4D5D6D7P8D9D10D11的形式,
          即此处 D3=D11=1, D5=D6=D7=D9 =D10=0,
          则由 P1 = D3+D5+D7+D9+D11,P2 = D3+D6+D7+D10+D11,
                   P4 = D5+D6+D7,P8 = D9+D10+D11    
          得:P1=0,P2=0,P4=0,P8=1
              ∴发送端形成的海明码为 00100001001
          若接收方接收错误,收到:00100001011 (D10错误)
          则检/纠错过程如下:计算校正因子S1、S2、S4、S8,
          得: S1=0,S2=1,S4=0,S8=1
              ∵ S2= S8= 1          ∴ 检测有错,
          错误位置在 S=1010 处即D10,将D10取反即可.


题目描述:

输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如'3’,输出:10110011)。

输入:

输入包括一个字符串,字符串长度不超过100。

输出:

可能有多组测试数据,对于每组数据,
对于字符串中的每一个字符,输出按题目进行奇偶校验后的数,每个字符校验的结果占一行。

样例输入:
3
3a
样例输出:
10110011
10110011
01100001
[cpp]  view plain copy
在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. int main()  
  6. {  
  7.     int len,buf[10],i,j;  
  8.     char str[101],a;  
  9.     while(scanf("%s",str) != EOF)  
  10.     {  
  11.         len = strlen(str);  
  12.         for(i = 0;i < len;i++)  
  13.         {  
  14.             int sum = 0;  
  15.             a = str[i];  
  16.             for(j = 0;j < 7;j++)  
  17.             {  
  18.                 if(a%2 == 1)  
  19.                 {  
  20.                     sum++;  
  21.                     buf[j] = 1;  
  22.                     a /= 2;  
  23.                 }  
  24.                 else  
  25.                 {  
  26.                     buf[j] = 0;  
  27.                     a /= 2;  
  28.                 }  
  29.             }  
  30.             if(sum%2 == 1)  
  31.             {  
  32.                 buf[j] = 0;  
  33.             }  
  34.             else  
  35.             {  
  36.                 buf[j] = 1;  
  37.             }  
  38.             for(j = 7;j >= 0;j--)  
  39.             {  
  40.                 printf("%d",buf[j]);  
  41.             }  
  42.             printf("\n");  
  43.         }  
  44.     }  
  45.     return 0;  
  46. }  



3. CRC(循环冗余校验码)

3.1 原理

将位串看成系数为 0 或 1 的多项式。
         如位串1 0 1 0 0 1 1 1 即对应于多项式: x^7 + x^5 + x^2 + x + 1
收发双方约定一个多项式G(x),发送方用位串及 G(x)进行某种运算得到校验和,并在帧的末尾加上校验和,使带校验和的帧的多项式能被 G(x) 整除; 接收方收到后,用 G(x) 除多项式,若有余数,则传输有错。

3.2 校验和计算

G(x)的最高阶和最低阶系数必须为1

设G(x)为n阶,待发送数据M = k (bits)

则校验和(冗余码)长度为r(bits)

M = 1010001101 , n = 5, G(x) = P = 110101

将余数 R 作为冗余码添加在数据 M 的后面发送出去,即发送的数据是101000110101110,或 2^n * M + R

常用的G(x)

NK码距dG(x)多项式G(x)
743

x3+x+1

1011
743

x3+x2+1

1101
734

x4+x3+x2+1

11101
734

x4+x2+x+1

10111
15113

x4+x+1

10011
1575

x8+x7+x6+x4+1

111010001
31263

x5+x2+1

100101
31215

x10+x9+x8+x6+x5+x3+1

11101101001

63573

x6+x+1

1000011

63515

x12+x10+x5+x4+x2+1

1010000110101

10411024 

x16+x15+x2+1

11000000000000101




这篇关于校验码:奇偶校验,汉明码,CRC循环冗余校验码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/701373

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

校验码:奇偶校验,CRC循环冗余校验,海明校验码

文章目录 奇偶校验码CRC循环冗余校验码海明校验码 奇偶校验码 码距:任何一种编码都由许多码字构成,任意两个码字之间最少变化的二进制位数就称为数据检验码的码距。 奇偶校验码的编码方法是:由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码。 奇校验:整个校验码中1的个数为奇数 偶校验:整个校验码中1的个数为偶数 奇偶校验,可检测1位(奇数位)的错误,不可纠错。

react笔记 8-17 属性绑定 class绑定 引入图片 循环遍历

1、绑定属性 constructor(){super()this.state={name:"张三",title:'我是一个title'}}render() {return (<div><div>aaaaaaa{this.state.name}<div title={this.state.title}>我是一个title</div></div></div>)} 绑定属性直接使用花括号{}   注

Spring是如何解决循环依赖?

现象解释: 在Spring框架中,循环依赖(Circular Dependency)是指两个或多个Bean之间相互依赖,形成了一个循环。例如,Bean A依赖于Bean B,而Bean B又依赖于Bean A。Spring通过多种机制解决循环依赖问题,具体来说,主要有以下几种方式: 1.三级缓存机制 Spring容器在实例化Bean时使用了三级缓存来解决循环依赖,主要涉及三个缓存结构: 一级

FPGA开发:条件语句 × 循环语句

条件语句 if_else语句 if_else语句,用来判断是否满足所给定的条件,根据判断的结果(真或假)决定执行给出的两种操作之一。 if(表达式)语句; 例如: if(a>b) out1=int1; if(表达式)         语句1; else         语句2; 例如: if(a>b)out1=int1;elseout1=int2; if(表达式1) 语句1; els

shell循环sleep while例子 条件判断

i=1# 小于5等于时候才执行while [ ${i} -le 5 ]doecho ${i}i=`expr ${i} + 1`# 休眠3秒sleep 3doneecho done 参考 http://c.biancheng.net/cpp/view/2736.html

checksum 与 CRC的不同之处

实际应用: CRC:在外发电压时,在报文的最后两个字节做了CRC计算。 checksum : 在按键状态外发,在报文的最后一个字节做了checksum计算。 它们的共同之处:目的都是为了数据的错误检测功能。 只是在算法的复杂度上有较大的区别: 总的来说,CRC算法更复杂,可检测的错误也比较丰富。 CRC与checksum的计算方式都是固定的吗? 在实际应用中,并没有通知对方,所用

【语音告警】博灵智能语音报警灯JavaScript循环播报场景实例-语音报警灯|声光报警器|网络信号灯

功能说明 本文将以JavaScript代码为实例,讲解如何通过JavaScript代码调用博灵语音通知终端 A4实现声光语音告警。主要博灵语音通知终端如何实现无线循环播报或者周期播报的功能。 本代码实现HTTP接口的声光语音播报,并指定循环次数、播报内容。由于通知终端采用TTS语音合成技术,所以本次案例中无需预先录制音频。 代码实战 为了通过JavaScript调用博灵语音通知终端,实现HT

【JavaScript】在循环内使用闭包

================== 基本循环语句 ==================for (var i = 0; i < 5; i++) {console.log(i);}console.log(i);//这个大家应该很快就知道了,012345================== setTimeout与var语句的for循环 ==================for (var i