深圳全飞鸿

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 682|回复: 2
打印 上一主题 下一主题

校验算法的讨论checksum

[复制链接]

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
跳转到指定楼层
楼主
发表于 2020-11-20 17:42:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhgc 于 2020-11-20 17:50 编辑

校验算法的讨论checksum

在线工具:  http://www.metools.info/code/c128.html


它通常是以十六进制为数制表示的形式,如:
十六进制串:
0102030405060708
的校验和是: 24 (十六进制)
如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和.
通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性.

回复

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
沙发
 楼主| 发表于 2020-11-20 17:45:49 | 只看该作者
C++实现checksum

[cpp]

  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3.   
  4. typedef struct {  
  5.     int srcIp;  
  6.     int dstIp;  
  7.     short udp_len;  
  8.     char rsv;  
  9.     char protocol;  
  10.     unsigned short src_port;  
  11.     unsigned short dst_port;  
  12.     unsigned short len;  
  13.     unsigned short check_sum;  
  14.     char data[2];  
  15. } UDPHDR;  
  16.   
  17. char arr[100] = {0xc0, 0xa8, 0xd1, 0x80, 0xc0, 0xa8, 0xd1, 0x01, 0x00, 0x0a, 0x00, 0x11, 0x13, 0x88, 0x13, 0x88, 0x00, 0x0a, 0x00, 0x00, 0x61, 0x66};  
  18.   
  19. unsigned short check_sum(unsigned short *a, int len);  
  20.   
  21. int main()  
  22. {  
  23.     short b = 0;  
  24.     UDPHDR udphdr = {0};  
  25.   
  26.     udphdr.srcIp = inet_addr("192.168.209.128");  
  27.     udphdr.dstIp = inet_addr("192.168.209.1");  
  28.     udphdr.udp_len = htons(10);  
  29.     udphdr.protocol = 0x11;  
  30.     udphdr.rsv = 0;  
  31.     udphdr.src_port = htons(5000);  
  32.     udphdr.dst_port = htons(5000);  
  33.     udphdr.len = htons(10);  
  34.     udphdr.check_sum = 0;  
  35.     udphdr.data[0] = 0x61;  
  36.     udphdr.data[1] = 0x66;  
  37.   
  38.     b = check_sum((short *)&udphdr, 22);  
  39.     printf("[test ...] b = %04x\n", b & 0xffff);  
  40.   
  41.     b = check_sum((short *)arr, 22);  
  42.     printf("[test arr] b = %04x\n", b & 0xffff);  
  43.   
  44.     return 0;  
  45. }  
  46.   
  47. unsigned short check_sum(unsigned short *a, int len)  
  48. {  
  49.     unsigned int sum = 0;  
  50.   
  51.     while (len > 1) {  
  52.         sum += *a++;  
  53.         len -= 2;  
  54.     }  
  55.   
  56.     if (len) {  
  57.         sum += *(unsigned char *)a;  
  58.     }  
  59.   
  60.     while (sum >> 16) {  
  61.         sum = (sum >> 16) + (sum & 0xffff);  
  62.     }  
  63.   
  64.     return (unsigned short)(~sum);  
  65. }  
复制代码
回复 支持 反对

使用道具 举报

800

主题

1379

帖子

7704

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7704
板凳
 楼主| 发表于 2020-11-20 17:48:49 | 只看该作者
在线工具:http://www.metools.info/code/c128.html


  1. #include"stdio.h"
  2. voidmain()
  3. {
  4. int a[8]={0x4E,0x00,0x00,0x20,0x65,0x00,0x00,0x00};
  5. int b[8],t;
  6. int i,sum=0;
  7. int j=0xD3;
  8. for(i=0;i<8;i++)
  9. {
  10.     b[i]=a[i];
  11. }
  12. for(i=0;i<8;i++)
  13. {
  14.     sum+=a[i];
  15. }
  16. t=sum&0xFF;
  17. t=~t&0xFF;
  18. b[1]=t;
  19. sum=0;
  20. for(i=0;i<8;i++)
  21. {
  22.     sum+=b[i];
  23. }
  24. printf("0x%X\n",sum&0xFF);
  25. }
复制代码

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|nagomes  

GMT+8, 2025-5-4 21:09 , Processed in 0.026224 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表