深圳全飞鸿

标题: 校验算法的讨论checksum [打印本页]

作者: zhgc    时间: 2020-11-20 17:42
标题: 校验算法的讨论checksum
本帖最后由 zhgc 于 2020-11-20 17:50 编辑

校验算法的讨论checksum

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


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


作者: zhgc    时间: 2020-11-20 17:45
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. }  
复制代码

作者: zhgc    时间: 2020-11-20 17:48
在线工具: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. }
复制代码






欢迎光临 深圳全飞鸿 (http://www.nagomes.com/disc/) Powered by Discuz! X3.2