奇偶校验是用于通信等处理的,一般很少直接用奇偶校验,而是结合通信协议来进行处理。
因为奇偶校验位可能是传输数据的一部分:
1. 对发送,会在正确数据后附一个校验位
2. 对接收,会在数据获取后,把正常位进行计算并和校验位进行比较
软件处理上,其实处理比较简单,就是对需要校验部分计数1的个数,看是偶数还是奇数个,就可以算出校验位(根据奇校验、偶校验还有其他协议规定置位要求置为1或者0)
apleilx的方法提供了具体的一种实现,但这种实现其实较少用,因为如果是1byte传输,则一般前7位是需要校验的,最后1位是校验位来判断接收数据是否正确的。即正常的校验输出会是 校验通过 或 校验不通过 这两种情况。 而它这种只用于 8位数据+1位校验的形式,这种通信本身就相对较少用到。
/@@*---------------------------------------------------------------------------- * 偶校验 *---------------------------------------------------------------------------*/ uint8_t EvenU8(uint8_t Data) //返回8位数据的偶校验结果,0表示偶数个1,1表示奇数个1 { Data ^= Data >> 4; //高4位和低4位相同位置若都是1则消去,0不用管 Data ^= Data >> 2; //原理同上,消去1、2和3、4相同位置的1, Data ^= Data >> 1; //原理同上,至此最低位留下消去所有成对1后的结果即偶校验结果 //Data &= 0x01; //返回校验结果为uint8时需要此句消除无效位 return (Data & 0x01); } /@@*---------------------------------------------------------------------------- * 奇校验 *---------------------------------------------------------------------------*/ uint8_t OddU8(uint8_t Data) //返回8位数据的奇校验结果,0表示奇数个1,0表示偶数个1 { Data ^= Data >> 4; //高4位和低4位相同位置若都是1则消去,0不用管 Data ^= Data >> 2; //原理同上,消去1、2和3、4相同位置的1, Data ^= Data >> 1; //原理同上,至此最低位留下消去所有成对1后的结果即偶校验结果 Data ++ ; //将偶校验结果(最低位)加1得到奇校验结果 //Data &= 0x01; //返回校验结果为uint8时需要此句消除无效位 return (Data & 0x01); }