定义
奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。
简单来说就是:
奇校验:使完整编码(有效位和校验位)中的”1”的个数为奇数个; 偶校验:使完整编码(有效位和校验位)中的”1”的个数为偶数个
示例
进入的数必须是7位以内的,然后二进制向左移一位,根据二进制中1的个数在后面加上1或者0(加0和没加一样),把二进制中1的个数凑成奇数个或者偶数个。
数据 | (1的个数) | 奇校验 | 偶校验 |
---|---|---|---|
000 0011 | (2) | 000 0011 1 | 000 0011 0 |
000 0100 | (1) | 000 0100 0 | 000 0100 1 |
111 1111 | (7) | 111 1111 0 | 111 1111 1 |
代码
C语言实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<stdio.h>
#include<string.h>
unsigned char add(char data)//奇校验
{
int i, cnt = 0;
for (i = 0; i < 7; i++)//一个char型有7位
{
int temp = ((data >> i) & 1);//data >> i是向右移i个位置得到的值,((data >> i) & 1)是与1不同的个数
cnt += temp;//cnt记录二进制下data中1的个数
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//当cnt能够被2整除,即cnt是偶数,即1的个数是偶数
{
ans += 1;//在最右边加1
}
else//当cnt不能够被2整除,即cnt是奇数,即1的个数是奇数
{
ans += 0;//在最右边加0
}
return ans;
}
unsigned char add_2(char data)//偶校验
{
int i, cnt = 0;
for (i = 0; i < 7; i++)//一个char型有7位
{
int temp = ((data >> i) & 1);//data >> i是向右移i个位置得到的值,((data >> i) & 1)是与1不同的个数
cnt += temp;//cnt记录二进制下data中1的个数
}
unsigned char ans = data << 1;//左移1位
if (cnt % 2 == 0)//当cnt能够被2整除,即cnt是偶数,即1的个数是偶数
{
ans += 0;//在最右边加0
}
else//当cnt不能够被2整除,即cnt是奇数,即1的个数是奇数
{
ans += 1;//在最右边加1
}
return ans;
}
int main()
{
char a;
unsigned char b;
scanf("%c", &a);
b = add(a);
printf("2进制结果表示为:");//输出b的2进制表示
for (int i = 7; i >= 0; i--) {
if (((b>>i) & 1) == 1)
printf("1");
else
printf("0");
} putchar(10);
printf("8进制结果表示为:%o\n",b);//输出b的8进制表示
printf("10进制结果表示为:%d\n",b);//输出b的10进制表示
printf("16进制结果表示为:%x\n", b);//输出b的16进制表示
return 0;
}
扩展
奇偶校验的优缺点:
1、奇偶校验有两种类型:奇校验和偶校验。奇偶校验位是一个表示给定位数的二进制数中1的个数是奇数或者偶数的二进制数,奇偶校验位是最简单的错误检测码。
2、传输过程中包括校验位在内的奇数个数据位发生改变,那么奇偶校验位将出错表示传输过程有错误发生。
3、奇偶校验位是一种错误检测码,但是由于没有办法确定哪一位出错,所以它不能进行错误校正。发生错误时必须扔掉全部的数据,然后从头开始传输数据。
4、在噪声很多的媒介上成功传输数据可能要花费很长的时间,甚至根本无法实现。
5、它是使用一位数据能够达到的最好的校验码,并且它仅仅需要一些异或门就能够生成。奇偶校验被广泛应用。
奇偶校验的用途: (1)奇偶校验是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。
(2)单向奇偶校验(Row Parity)由于一次只采用单个校验位,因此又称为单个位奇偶校验。发送器在数据祯每个字符的信号位后添一个奇偶校验位,接收器对该奇偶校验位进行检查。典型的例子是面向ASCII码的数据信号祯的传输,由于ASCII码是七位码,因此用第八个位码作为奇偶校验位。
(3)奇偶校验只可以简单判断数据的正确性,从原理上可看出当一位出错,可以准确判断,如同时两个1变成两个0就校验不出来了,只是两位或更多位及校验码在传输过程中出错的概率比较低,奇偶校验可以用的要求比较低的应用下。同时,它不能纠错。在发现错误后,只能要求重发。