#include
main()
{
char dat
TMOD=0x20
TH1=0xfd
TL1=0xfd
TR1=1
SCON=0xd0
while(1)
{
dat++
ACC=dat
TB8=P //校验位送第九数据位TB8
SBUF=ACC
while(TI==0)
TI=0
}
}
奇偶校验码计算:
首先字符T的十进制是84,转换成二进制是101 0100,最高位设置为奇校验,所以看101 0100中有3个1,是奇数个,所以最高位就为0使得校验后的数中1的个数还是奇数个,故为:0101 0100。
偶校验,内存中最小的单位是比特,也称为“位”,位有只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。
奇偶校验
就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数,那么在校验位定义为1,反之为0。
当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。
//奇偶校验//data 要校验的数据起始地址
//length 数据长度,多少字节
//sum 校验码
//mode 校验方式,true:奇校验,false : 偶校验
//返回值 true: 校验成功 false:校验失败
bool CheckSum(char *data,int length,char sum , bool mode)
{
char tmp=0
for(int i=0i<lengthi++)
{
tmp+=*data
data++
}
if(mode)
{
if(tmp+sum == 1)
{
return true
}
else
{
return false
}
}
else
{
if(tmp+sum == 0)
{
return true
}
else
{
return false
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)