校验和(Checksum)是网络协议使用的数据错误检测方法,并且被认为比LRC(纵向冗余校验,Longitudinal Redundancy Check,LRC),VRC和CRC(循环冗余校验(Cyclic Redundancy Codes,CRC))更可靠。此方法在发送方使用校验和生成器,在接收方使用校验和校验器。

累加和校验算法的实现

发送方:对要数据累加,得到一个数据和,对和求反,即得到我们的校验值。然后把要发的数据和这个校验值一起发送给接收方。

接收方:对接收的数据(包括校验和)进行累加,然后加1,如果得到0,那么说明数据没有出现传输错误。

注意,此处发送方和接收方用于保存累加结果的类型一定要一致,否则加1就无法实现溢出从而无法得到0,校验就会无效。

步骤

  1. 校验数据以16bit为单位进行累加求和,校验数据需为偶字节数(不然无法以16bit为累加单位),奇字节数末尾填充0变为偶字节数;
  2. 累加和超过16bit,产生进位,将进位当作高16bit,其他数为低16bit,进行相加;
  3. 循环步骤2,直到没有进位产生为止,得到sum值
  4. 累加和取反得到校验和,即checksum值,存入数据的checksum字段即可。

两个例子

  1. 需要发送数据(8bit 2进制) 10101001 00111001 00001010

    奇字节补0:10101001 00111001 00001010 00000000

    10101001 + 00111001 + 00001010 + 00000000 = 11101100(sum值)

    ~11101100 = 00010011(checksum值)

    所以发送的数据就是: 10101001 00111001 00001010 00010011

    接收方接收到的数据是: 10101001 00111001 00001010 00010011

    10101001 + 00111001 + 00001010 + 00010011 = 11111111(sum值)

    ~11111111 = 00000000(结果是0,校验完成,没有错误)
> 8位保存累加和
  1. 需要发送的数据(16bit 16进制) 1234 003c 1c46 4000 4006 'checksum' ac00 0a63 ac10 0a0c

    根据原始数据计算出checksum(至于checksum段的位置,我想可能是自定义的,在哪都不影响), 才是发送出去的完成数据

    先将checksum段置0,1234 003c 1c46 4000 4006 0000 ac00 0a63 ac10 0a0c

    sum = 1234 + 003c + 1c46 + 4000 + 4006 + 0000 + ac00 + 0a63 + ac10 + 0a0c = 21b3b (进位加到低16bit末尾)

    checksum = ~1b3d = e4c2(即checksum值)

    所以发送方发送的数据为:1234 003c 1c46 4000 4006 e4c2 ac00 0a63 ac10 0a0c(补全 cehcksum字段)

    sum = 1234 + 003c + 1c46 + 4000 + 4006 + e4c2 + ac00 + 0a63 + ac10 + 0a0c = 2fffd(再回加)

    checksum = ~ffff=0000

    接收方checksum=0,校验成功
> 16位保存累加和

CheckSum算法--又名累加和校验算法的更多相关文章

  1. 链接分析算法之:HillTop算法

      链接分析算法之:HillTop算法     Hilltop算法是由Krishna Baharat 在2000年左右研究的,于2001年申请专利,但是有很多人以为Hilltop算法是由谷歌研究的.只 ...

  2. C++进阶 STL(3) 第三天 函数对象适配器、常用遍历算法、常用排序算法、常用算数生成算法、常用集合算法、 distance_逆序遍历_修改容器元素

    01昨天课程回顾 02函数对象适配器 函数适配器是用来让一个函数对象表现出另外一种类型的函数对象的特征.因为,许多情况下,我们所持有的函数对象或普通函数的参数个数或是返回值类型并不是我们想要的,这时候 ...

  3. 算法:Astar寻路算法改进,双向A*寻路算法

    早前写了一篇关于A*算法的文章:<算法:Astar寻路算法改进> 最近在写个js的UI框架,顺便实现了一个js版本的A*算法,与之前不同的是,该A*算法是个双向A*. 双向A*有什么好处呢 ...

  4. Atitit.软件中见算法 程序设计五大种类算法

    Atitit.软件中见算法 程序设计五大种类算法 1. 算法的定义1 2. 算法的复杂度1 2.1. Algo cate2 3. 分治法2 4. 动态规划法2 5. 贪心算法3 6. 回溯法3 7. ...

  5. JVM内存管理------GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

  6. 缓存算法(页面置换算法)-FIFO、LFU、LRU

    在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO.LFU 1.FIFO算法 FIFO(First in First ...

  7. opencv3中的机器学习算法之:EM算法

    不同于其它的机器学习模型,EM算法是一种非监督的学习算法,它的输入数据事先不需要进行标注.相反,该算法从给定的样本集中,能计算出高斯混和参数的最大似然估计.也能得到每个样本对应的标注值,类似于kmea ...

  8. Floyd-Warshall算法,简称Floyd算法

    Floyd-Warshall算法,简称Floyd算法,用于求解任意两点间的最短距离,时间复杂度为O(n^3). 使用条件&范围通常可以在任何图中使用,包括有向图.带负权边的图. Floyd-W ...

  9. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,循环控制及其优化

    上两篇博客 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案 8皇后以及N皇后算法探究,回溯算法的JAVA实现,非递归,数据结构“栈”实现 研究了递归方法实现回溯,解决N皇后问题,下面我们来 ...

  10. 最短路径算法之二——Dijkstra算法

    Dijkstra算法 Dijkstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 注意该算法要求图中不存在负权边. 首先我们来定义一个二维数组Edge[MAXN][MAXN]来存储 ...

随机推荐

  1. 正在开发的.net sql拼写神器

    我正在开发的一个.net sql拼写工具,当然也可以算是ORM 该工具的作用就是帮忙码农拼写sql,对标开源项目SqlKata.该工具最适合搭配Dapper使用,所以附带了一个Dapper扩展.当然直 ...

  2. H5 ios端底部安全距离CSS

    html 头部添加 <meta name="viewport" content="width=device-width, initial-scale=1.0,min ...

  3. 《PDPU: An Open-Source Posit Dot-Product Unit for Deep Learning Applications》(三)

    Supporting suitable alignment width: In several designs [8] [19], quire [33] format is adopted to re ...

  4. 题解:CF1955E Long Inversions

    简单题. 考虑贪心地进行修改,每次选择字符串中最左侧第一个 000,并以该位置为左端点进行一次修改,可以发现若 lenlenlen 合法则这样一定构造出全 111 串. 然而直接暴力实现是 O(n2) ...

  5. centos 7.9下载地址

    http://isoredirect.centos.org/centos/7/isos/x86_64/ In order to conserve the limited bandwidth avail ...

  6. webapi里调用grpc

    参照:ASP .NET Core 6.0使用Grpc配置服务和调用服务_asp.net core grpc 服务-CSDN博客 demo:https://files.cnblogs.com/files ...

  7. 在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接

    在Podman中配置Dify Sandbox服务与外部PostgreSQL服务的网络连接 引言 在容器化环境中,确保不同服务之间的可靠通信是至关重要的.本文将指导你如何使用Podman来配置Dify ...

  8. struts2——Action的三种编写方式

    Action有三种编写方式POJO方式.实现Action接口.继承ActionSupport类 推荐采用继承ActionSupport类这种方式.因为这个类的功能比较丰富. 方式一:POJO方式 pa ...

  9. DialogHub上线OpenHarmony开源社区,高效开发鸿蒙应用弹窗

    作为鸿蒙应用开发者,在使用ArkUI现有能力进行弹窗开发时,总会遇到一些让人纠结的交互问题:应用内进行消息提示时,既要求消息内容支持图文混排,又要求弹窗本身不能打断用户交互(页面滑动.页面点击.键盘输 ...

  10. Seata源码—5.全局事务的创建与返回处理

    大纲 1.Seata开启分布式事务的流程总结 2.Seata生成全局事务ID的雪花算法源码 3.生成xid以及对全局事务会话进行持久化的源码 4.全局事务会话数据持久化的实现源码 5.Seata Se ...