SC(SumCheck)累加和校验

1、SC(SumCheck)累加和校验

这种算法的实现:

发送方:对要数据累加,得到一个数据和,对和求反,即得到我们的校验值。然后把要发的数据和这个校验值一起发送给接收方。

接收方:对接收的数据(包括校验和)进行累加,然后加1,如果得到0,那么说明数据没有出现传输错误。(注意,此处发送方和接收方用于保存累加结果的类型一定要一致,否则加1就无法实现溢出从而无法得到0,校验就会无效)

还是举个例子:

发送方:要发送0xA8,0x50,我们使用unsigned char(8位)来保存累加和,即为0xF8(0b11111000),取反得到校验和为0x07(0b00000111)。然后将这三个数据发送出去。

接收方:如果接收正确,这三个数据的累加和就是(0b11111111),此时加1,则得到的结果为0(实际得到的应该是0b100000000,但是由于是使用unsigned char(8位)来保存累加和,所以高位被截取掉,只剩下了低八位的8个0).

由上面的例子,我们可以知道算法的目的是:使累加和和校验值相加得到一个二进制下每一位都是1的结果,这个结果很明显很好处理,这种算法实现起来也很简单,下面给出C语言的代码示例。

发送方:以下是如何得到校验值的代码,结果就是我们想要的校验值。


   比如下面的例子:
    我们要传输的信息为: 6、23、4
    加上校验和后的数据包:6、23、4、33
    这里 33 为前三个字节的校验和。接收方收到全部数据后对前三个数据进行同样的累加计算,如果累加和与最后一个字节相同的话就认为传输的数据没有错误。
2、软件实现;

unsigned char Data_12B[9] = {0x2a, 0xfb, 0x0a, 0x14, 0x1e, 0x28, 0x32, 0x3c, 0xf7};
unsigned char Data_12A[9] = {0x2a, 0xfb, 0x0a, 0x14, 0x1e, 0x28, 0x32, 0x3c, 0x08};

0xf7是0x2a, 0xfb, 0x0a, 0x14, 0x1e, 0x28, 0x32, 0x3c的累加和.

0x08是 0xf7取反.

Data_12A[8] = Fun_SC_Create(Data_12A, 8);//数组中前8个原素累加并赋值

Data_12A[8]等于0x08

Fun_SC_Check(Data_12A, 9)等于0xff   //数组中9个原素累加

加1后溢出 

(Fun_SC_Check(Data_12A, 9)+1)&0xff  取低8位   为 0 

#include<stdio.h>
 
static unsigned char Fun_SC_Create(unsigned char *p1, unsigned short int len);
static unsigned char Fun_SC_Check(unsigned char *p1, unsigned short int len);
unsigned char Data_11B[11] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10};
unsigned char Data_12B[9] = {0x2a, 0xfb, 0x0a, 0x14, 0x1e, 0x28, 0x32, 0x3c, 0xf7};
unsigned char Data_12A[9] = {0x2a, 0xfb, 0x0a, 0x14, 0x1e, 0x28, 0x32, 0x3c, 0x08};
/**
 *********************************************************************************
 * @file             main.c
 * @auther           li
 * @version          1.1.1
 * @data             2018-12-26 19:02:01
 * @brief            主函数
 * @param
 * @retval            none
 * @attention
 *********************************************************************************
*/
int main(int argc, char **argv)
{
    printf("This is a SC Data Check test!!!\r\n");
   // Data_11B[10] = Fun_SC_Create(Data_11B, 10);//计算机校验和
    if(Fun_SC_Check(Data_11B, 10) == Data_11B[10])//
    {
        printf("Data_11B[]Check is ok!!!\r\n");
        printf("Data_11B[10]=%x\n",Data_11B[10]);
    }
    else
    {
        printf("Data_11B[]Check is err!!!\r\n");
        printf("Data_11B[10]=%x\n",Data_11B[10]);
    }

    //Data_12B[8] = Fun_SC_Create(Data_12B, 8);
    if(Fun_SC_Check(Data_12B, 8) == Data_12B[8])
    {
        printf("Data_12B[]Check is ok!!!\r\n");
        printf("Data_12B[8]=%x\n",Data_12B[8]);
    }
    else
    {
        printf("Data_12B[]Check is err!!!\r\n");
        printf("Data_12B[8]=%x\n",Data_12B[8]);
    }

     Data_12A[8] = Fun_SC_Create(Data_12A, 8);
     if(((Fun_SC_Check(Data_12A, 9)+1)&0xff) == 0)
    {
        printf("Data_12A[]Check is ok!!!\r\n");
        printf("Data_12A[8]=%x\n",Data_12A[8]);
        printf("Fun_SC_Check(Data_12A, 9)1:%x\r\n",Fun_SC_Check(Data_12A, 9));
    }
    else
    {
        printf("Data_12A[]Check is err!!!\r\n");
        printf("Data_12A[8]=%x\n",Data_12A[8]);
        printf("Fun_SC_Check(Data_12A, 9)2:%x\r\n",Fun_SC_Check(Data_12A, 9));
    }


    while(1);
}
/**
 *********************************************************************************
 * @file             main.c
 * @auther           li
 * @version          1.1.1
 * @data             2018-12-26 19:02:27
 * @brief            函数功能: 生成 SC
 * @param            p1:待生成校验数据的首地址
 *                   len:待生成校验数据长度
 * @retval           校验后的数据
 * @attention
 *********************************************************************************
*/
static unsigned char Fun_SC_Create (unsigned char *p1, unsigned short int len)
{
    unsigned char sum = 0;
    for(;len > 0; len--)
    {
        sum += *p1++;
    }
        sum=~sum;
    return sum;
}
/**
 *********************************************************************************
 * @file             main.c
 * @auther           li
 * @version          1.1.1
 * @data             2018-12-26 19:02:33
 * @brief            函数功能: SC 校验
 * @param            p1:待校验的数据首地址
 *                   len:待校验数据长度
 * @retval           校验后的数据
 * @attention
 *********************************************************************************
*/
static unsigned char Fun_SC_Check(unsigned char *p1, unsigned short int len)
{
    unsigned char sum=0;
    for(;len > 0; len--)
    {
        sum += p1[len-1];
    }
    return sum;
}
 
This is a SC Data Check test!!!
Data_11B[]Check is err!!!
Data_11B[10]=10
Data_12B[]Check is ok!!!
Data_12B[8]=f7
Data_12A[]Check is ok!!!
Data_12A[8]=8
Fun_SC_Check(Data_12A, 9)1:ff

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值