奇偶校验原理(来自百度百科):奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。

C代码实现如下:

#include <stdio.h>

#define uint32_t unsigned int
#define uint16_t unsigned short
#define uint8_t unsigned char /* 从data中获取第n bit的值 注:data只能为uint8*类型指针 */
#define GET_BIT_N_VAL(data, n) \
(0x1 & (( *((data) + (n)/8) & (0x1 << ((n)%8)) ) >> ((n)%8))) uint8_t soc_gen_even_parity_common(uint8_t *entry_data, uint16_t entry_len)
{
uint32_t i = 0;
uint32_t even_parity = 0;
for(i = 0; i < entry_len; i++)
{
even_parity += GET_BIT_N_VAL((entry_data), i);
} return (even_parity & 0x1);
} uint8_t soc_gen_old_parity_common(uint8_t *entry_data, uint16_t entry_len)
{
uint32_t i = 0;
uint32_t odd_parity = 0; for(i = 0; i < entry_len; i++)
{
odd_parity += odd_parity+ GET_BIT_N_VAL((entry_data), i);
} if (odd_parity % 2 == 0)
return 1;
else
return 0;
} int main(void)
{
uint8_t data[] = {0xff, 1, 0xff, 1};
uint8_t ret = 0;
uint8_t i = 0; printf("original data: ");
for (i = 0; i < sizeof(data); i++)
printf("0x%x ", data[i]);
printf("\n"); ret = soc_gen_even_parity_common(data, sizeof(data) * 8);
printf("even parity result: %u\n", ret);
ret = soc_gen_old_parity_common(data, sizeof(data) * 8);
printf(" odd parity result: %u\n", ret); return 0;
}

编译运行测试:

$ ./a.out
original data: 0xff 0x1 0xff 0x1
even parity result: 0
odd parity result: 1

分析运行结果,输入的原始数据为:0xff 0x1 0xff 0x1,则"1"的个数为8+1+8+1=18,采用偶校验,"1"的个数为偶数,所以结果为1;采用奇校验,“1”的个数为奇数,所以结果为1。

C实现奇偶校验的更多相关文章

  1. STM32 奇偶校验配置

    void MX_USART2_UART_Init(void){ huart2.Instance = USART2; huart2.Init.BaudRate = 9600; huart2.Init.W ...

  2. 校验码(海明校验,CRC冗余校验,奇偶校验)

    循环冗余校验码 CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书 ...

  3. 准循环LDPC码用于公钥密码时的奇偶校验矩阵

    设H为奇偶校验矩阵,其行权重为d.Q为转置矩阵,其行权重为m.对于LDPC码,有d/n<< 1, m/n< 1. H´=H·QT是用于公钥密码的奇偶校验矩阵.它不是老密码G的奇偶校验 ...

  4. 常用校验码(奇偶校验,海明校验,CRC)学习总结

    常用校验码(奇偶校验,海明校验,CRC)学习总结 一.为什么要有校验码? 因为在数据存取和传送的过程中,由于元器件或者噪音的干扰等原因会出现错误,这个时候我们就需要采取相应的措施,发现并纠正错误,对于 ...

  5. 痞子衡嵌入式:常用的数据差错控制技术(2)- 奇偶校验(Parity Check)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家讲的是嵌入式里数据差错控制技术-奇偶校验. 在系列第一篇文章里,痞子衡给大家介绍了最简单的校验法-重复校验,该校验法实现简单,检错纠错能力都还不 ...

  6. STM32 串口通信使用奇偶校验

    STM32串口通信如果使用奇偶校验,需要设置数据位长度为9bit USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USAR ...

  7. C语言位操作--奇偶校验算法

    信息是以比特流的方式传输的,类似01000001.在传输过程中,有可能会发生错误,比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1.为了检测到这种错误,我们可以通过 ...

  8. 九度OJ 1197:奇偶校验 (基础题)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3590 解决:1511 题目描述: 输入一个字符串,然后对每个字符进行奇校验,最后输出校验后的二进制数(如'3',输出:10110011). ...

  9. STM32 单片机的USART的奇偶校验 误区(坑)

    当STM32的串口配置成带有奇偶校验位的情况下,需要软件校验是否发生奇偶校验错误,硬件只是置起奇偶校验错误标志位,并将错误的数据放到DR寄存器中,同时置起RXEN标志位,如果使能中断还是会正常进入中断 ...

随机推荐

  1. Go语言实现的23种设计模式之结构型模式

    摘要:本文主要聚焦在结构型模式(Structural Pattern)上,其主要思想是将多个对象组装成较大的结构,并同时保持结构的灵活和高效,从程序的结构上解决模块之间的耦合问题. 本文分享自华为云社 ...

  2. VisualStudio自动添加注释

    1.VisualStudio  新开页自动添加注释 a 在团队开发或者公司开发中,我们一般都喜欢给自己所创建的类或者接口以及其它模板设置版权说明,但是每个类一个一个的去加又是非常的费劲,所以一般情况下 ...

  3. redis学习第三天(Java使用redis)

    Java使用redis首先需要一个jar包,jedis.jar,这边给出下载地址:https://mvnrepository.com/artifact/redis.clients/jedis,要下载最 ...

  4. 去除office自动生成目录后生成的小框框(内容控件,目录控件)

    如何自动生成目录在这里就不进行阐述了,想必能看到这这里的人已经完成了目录的自动生成,那我就来直接演示如何去除自动生成目录后烦人的目录内容控件吧 直接上图片

  5. Visual Studio Code 和Visual Studio插件收集(持续更新)

    Visual Studio Code 插件收集 Chinese (Simplified) Language Pack 默认刚安装的VSC是原味英文的,如果你用不习惯,非常简单,官方出品的简体中文语言包 ...

  6. Go 中的 channel 与 Java BlockingQueue 的本质区别

    前言 最近在实现两个需求,由于两者之间并没有依赖关系,所以想利用队列进行解耦:但在 Go 的标准库中并没有现成可用并且并发安全的数据结构:但 Go 提供了一个更加优雅的解决方案,那就是 channel ...

  7. 1.5Java、万维网以及其他

    要点提示:Java是一种功能强大和多用途的编程语言,可用于开发运行在移动设备.台式计算机以及服务器端的软件.

  8. 使用IDEA配置Maven

    IDEA中配置Maven File --> settings 推荐配置:设置maven在不联网的情况下使用本地插件 一般使用maven为我们提供好的骨架时,是需要联网的,配置这个,可以在没有网络 ...

  9. SpringBoot:WebSocket使用Service层的方法

    方法一: 创建工具类 ApplicationContextRegister.java import org.springframework.beans.BeansException; import o ...

  10. diff -u:内核开发的新项目

    译至:http://www.linuxjournal.com/content/diff-u-whats-new-kernel-development-1 Linux的一个问题是它的系统调用实现 . 正 ...