Checksum算法(累加校验和)
Checksum的计算协议不同,计算方式也不同,在can协议中,部分OEM规定的checksum算法为crc8按位异或(也就是E2E),tcp及udp中为累加校验和,计算的位置位于TCP头部。本文讲解TCP,UDP中的CheckSum计算过程。
TCP中的Checksum
Checksum计算过程:
1、 先将需要计算checksum数据中的checksum设为0;
1、 先将需要计算checksum数据中的checksum设为0;
2、 计算checksum的数据按2byte划分开来,每2byte组成一个16bit的值,如果最后有单个byte的数据,补一个byte的0组成2byte;
3、 将所有的16bit值累加到一个32bit的值中;
4、 将32bit值的高16bit与低16bit相加到一个新的32bit值中,若新的32bit值大于0Xffff,再将新值的高16bit与低16bit相加;
5、 将上一步计算所得的16bit值按位取反,即得到checksum值,存入数据的checksum字段即可
计算例子:
如计算下面一段数据的checksum,数据为16进制;
45 00 00 3c 00 00 00 00 40 11 6d 36 c0 a8 2b c3 08 08 08 08 11
红色的6d 36为checksum字段,先把checksum设0,数据分组,补0,整理完后数据如下,中间checksum设置为0,最后补1byte 0;
4500 003c 0000 0000 4011 0000 c0a8 2bc3 0808 0808 1100
计算:4500+003c+0000+0000+4011+0000+c0a8+2bc3+0808+0808+1100 = 192C8
高低16bit相加: 1 + 92C8 = 92C9
取反: ~92C9 = 6D36
最后所得数据为:45 00 00 3c 00 00 00 00 40 11 6d 36 c0 a8 2b c3 08 08 08 08 11
对应代码如下:
static u16_t chksum(void *dataptr, u16_t len)//只演示checksum累加的过程 { u32_t acc; u16_t src; u8_t *octetptr; acc = 0; octetptr = (u8_t*)dataptr; while (len > 1) { src = (*octetptr) << 8; octetptr++; src |= (*octetptr); //补足两个字节长度 octetptr++; acc += src; len -= 2; } if (len > 0) { src = (*octetptr) << 8; acc += src; } acc = (acc >> 16) + (acc & 0x0000ffffUL); if ((acc & 0xffff0000UL) != 0) { acc = (acc >> 16) + (acc & 0x0000ffffUL); } src = (u16_t)acc; return ~src;//取反 }
大人们,时代变了~建议大家直接ChatGpt~哈哈哈哈哈
本文来自博客园,作者:{张一默},转载请注明原文链接:https://www.cnblogs.com/YiMo9929/p/16531568.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了