深圳全飞鸿
标题:
校验算法的讨论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]
#include <stdio.h>
#include <unistd.h>
typedef struct {
int srcIp;
int dstIp;
short udp_len;
char rsv;
char protocol;
unsigned short src_port;
unsigned short dst_port;
unsigned short len;
unsigned short check_sum;
char data[2];
} UDPHDR;
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};
unsigned short check_sum(unsigned short *a, int len);
int main()
{
short b = 0;
UDPHDR udphdr = {0};
udphdr.srcIp = inet_addr("192.168.209.128");
udphdr.dstIp = inet_addr("192.168.209.1");
udphdr.udp_len = htons(10);
udphdr.protocol = 0x11;
udphdr.rsv = 0;
udphdr.src_port = htons(5000);
udphdr.dst_port = htons(5000);
udphdr.len = htons(10);
udphdr.check_sum = 0;
udphdr.data[0] = 0x61;
udphdr.data[1] = 0x66;
b = check_sum((short *)&udphdr, 22);
printf("[test ...] b = %04x\n", b & 0xffff);
b = check_sum((short *)arr, 22);
printf("[test arr] b = %04x\n", b & 0xffff);
return 0;
}
unsigned short check_sum(unsigned short *a, int len)
{
unsigned int sum = 0;
while (len > 1) {
sum += *a++;
len -= 2;
}
if (len) {
sum += *(unsigned char *)a;
}
while (sum >> 16) {
sum = (sum >> 16) + (sum & 0xffff);
}
return (unsigned short)(~sum);
}
复制代码
作者:
zhgc
时间:
2020-11-20 17:48
在线工具:
http://www.metools.info/code/c128.html
#include"stdio.h"
voidmain()
{
int a[8]={0x4E,0x00,0x00,0x20,0x65,0x00,0x00,0x00};
int b[8],t;
int i,sum=0;
int j=0xD3;
for(i=0;i<8;i++)
{
b[i]=a[i];
}
for(i=0;i<8;i++)
{
sum+=a[i];
}
t=sum&0xFF;
t=~t&0xFF;
b[1]=t;
sum=0;
for(i=0;i<8;i++)
{
sum+=b[i];
}
printf("0x%X\n",sum&0xFF);
}
复制代码
欢迎光临 深圳全飞鸿 (http://www.nagomes.com/disc/)
Powered by Discuz! X3.2