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
5249

被折叠的 条评论
为什么被折叠?



