大家好,欢迎来到IT知识分享网。
1、奇偶校验
奇偶校验位是一种错误检测码,但是由于没有办法确定哪一位出错,所以它不能进行错误校正。发生错误时必须扔掉全部的数据,然后从头开始传输数据。奇偶校验对2个错误位的情况也无法判处,出现负负得正的结果。
有些场景对字节类型数据的奇偶校验使用前7位表示数据,最低位表示奇偶校验标记,如下标所示。
原始数据 | 1的个数 | 奇校验码 | 偶校验码 |
---|---|---|---|
10111010 | 5 | 10111010 | 10111011 |
11010010 | 4 | 11010011 | 11010010 |
2、计算方法
根据奇偶校验的定义,计算奇偶校验的本质就是统计1的个数,然后在尾数上补1或补0。
如果是奇校验,当数据里面的”1″的个数为奇数个时,不需要改动即在最后添0,为偶数个添1使“1”的总数为奇数个。偶校验逻辑刚好相反。
2.1对1出现的次数进行计数
uint8_t parity_set(uint8_t data, bool is_even) { int cnt = 0; uint8_t tmp = data >> 1; for (int i = 0; i < 7; i++) { if ((tmp >> i) & 0x01) { cnt++; } } if (is_even && (cnt % 2 == 1)) { data |= 0x01; } else if (!is_even && (cnt % 2 == 0)) { data |= 0x01; } return data; }
2.2对1出现的次数进行奇偶交替标记
例如:1111 0000 : 奇-偶-奇-偶, 结果为偶数个。如果奇校验就补1,偶校验就补0。
uint8_t parity_set(uint8_t data, bool is_even) { int cnt = 0; int p = 0; uint8_t tmp = data >> 1; for (int i = 0; i < 7; i++) { if ((tmp >> i) & 0x01) { p = 1 - p; } } data = (data & 0xFE) | (is_even ? p : (1 - p)); return data; }
2.3使用按位异或
对包含奇数个1的数据两两按位异或之后一定为1,偶数个1的数据按位异或后一定为0,基于这个原理,可以把for循环改写提高效率。
uint8_t parity_set(uint8_t data, bool is_even) { int cnt = 0; int p = 0; uint8_t tmp = data >> 1; if (tmp != 0) { tmp ^= tmp >> 4; tmp ^= tmp >> 2; tmp ^= tmp >> 1; tmp &= 1; } data = (data & 0xFE) | (is_even ? tmp : (1 - tmp)); return data; }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/31709.html