5、checksum(校验和)的实现

一、8位校验和的实现

1.发送端计算8位校验和的步骤:

  (1)把校验和字段设置为0。

  (2)把需要校验的数据看成以8位为单位的数字组成,依次进行求和,得到的和二进制求反码,再加上1,最终得到校验和。

  (3)把得到的结果存入校验和字段中。

2.接收端校验校验和步骤:

  (1)把需要校验的内容(包括校验和字段)看成以8位为单位的数字,依次进行二进制反码求和,如果结果是0表示正确,否则表示错误。

3.实现代码:

 1 static unsigned char sg_ucSeq = 0;
 2 typedef struct
 3 {
 4     unsigned long hid;
 5     unsigned long cid;
 6 
 7     unsigned char type;
 8     unsigned char len;    
 9     unsigned char checksum;
10     unsigned char seq;
11 
12     unsigned char userData[MAX_USER_DATA_SIZE];
13 }DATA_T;
14 
15 #define MAX_USER_DATA_SIZE       40
16 #define DATA_HEADER_LEN (sizeof(DATA_T) - MAX_USER_DATA_SIZE)
17 
18 // 发送端调用
19 unsigned char MakeCheckSum8(DATA_T *pData)
20 {
21     unsigned char ucCheckSum = 0;
22     unsigned char ucNum;
23     unsigned char *pucDat = (unsigned char *)pData;
24 
25     for(ucNum=0;ucNum<pData->len;ucNum++){
26         ucCheckSum += pucDat[ucNum];
27     }
28 
29     ucCheckSum = ~ucCheckSum;
30     ucCheckSum++;
31     
32     return ucCheckSum;
33 }
34 
35 // 接收端调用
36 unsigned char CheckData8(DATA_T *pData)
37 {
38     unsigned char ucCheckSum = 0;
39     unsigned char ucNum;
40     unsigned char *pucDat = (unsigned char *)pData;
41 
42     for(ucNum=0;ucNum<pData->len;ucNum++){
43         ucCheckSum += pucDat[ucNum];
44     }
45     
46     return ucCheckSum;
47 }
48 void create_common_msg(DATA_T *pfdata, unsigned char type, unsigned char *pdata, int len)
49 {
50     memset(pdata, 0, sizeof(DATA_T));
51 
52     pfdata->clientid = 0x12345678;
53     pfdata->type = type;
54     pfdata->len = FJ_DATA_HEADER_LEN + len;
55     pfdata->checksum = 0;
56     pfdata->seq = sg_ucSeq++;
57 
58     if (len > 0)
59     {
60         memcpy(pfdata->userData, pdata, len);
61     }
62 
63     pfdata->checksum     = MakeCheckSum8(pdata);
64 
65     return;
66 }

猜你喜欢

转载自www.cnblogs.com/sbtblogs/p/12228406.html