首页 > 编程语言 >CheckSum算法--又名累加和校验算法

CheckSum算法--又名累加和校验算法

时间:2024-09-11 16:47:44浏览次数:9  
标签:和校验 -- checksum 校验 累加 算法 00111001 10101001 16bit

校验和(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,校验,累加,算法,00111001,10101001,16bit
From: https://www.cnblogs.com/pikacq/p/18408076

相关文章

  • PDshell16逆向PostgreSQL 工程显示字段comment备注
    现状:当刚逆向成功的表结构是没有原来表结构中的,comment备注如下 然后pd逆向工程的sql已经返回了这个备注的含义 解决方案:1、设置显示注释列tools——DisplayPreferences…如下    勾选-按照下面得方式勾选这三个 复制这里的VBS脚本,打开菜单Tools>Execute......
  • C语言中 '=='的优先级高于 '&' '|' '&&' '||'
    之前一直以为 '=='的优先级低于  '&''|',但是这是错误的, '=='的优先级高于'&''|''&&''||',同时使用时,记得加括号修改优先级。 第一优先级:[]       ()      .      ->   方括号,圆括号,对象,......
  • 24小时搜书Z-library最新国内访问入口镜像网址(持续更新)
     24小时搜书Z-library简介 24小时搜书Z-library,这是一个基于IPFS的电子书搜索引擎,收录了大量图书,据介绍有1000万本以及8000篇文章,可以通过书名、作者、出版社、扩展名、ISBN等多种信息进行搜索。各种常见的电子书格式如pdf、mobi、epub、azw3等都支持下载。Z-libra......
  • SolidJS-每日小知识(9/11)
    知识介绍对指定SVG元素实现滚轮zoom代码分析1.对指定SVG元素实现滚轮zoom设置viewBox属性{x,y,w,h}以及缩放系数scale为信号量const[scale,setScale]=createSignal(1);//初始缩放比例const[boxLocation,setboxLocation]=createSignal({x:0,y:0});......
  • 高等数学 1.7 无穷小的比较
    定义:如果\(\lim\cfrac{\beta}{\alpha}=0\)那么就说\(\beta\)是比\(\alpha\)高阶的无穷小,记作\(\beta=o(\alpha)\);如果\(\lim\cfrac{\beta}{\alpha}=\infty\),那么就说\(\beta\)是比\(\alpha\)低阶的无穷小;如果\(\lim\cfrac{\beta}{\alpha}=c......
  • Rust 助力无服务器构筑云计算新引擎
    引言今年AmazonLambda迎来了它的第一个十周年。在过去的十年里,无服务器架构改变了软件开发的方式,简化了应用程序的部署和扩展,成为云计算的新引擎。而在众多支持无服务器技术的编程语言中,Rust以其卓越的安全性和高性能成为了开发者的宠儿。在这篇博客中,我们将探讨Rust如何在......
  • 拆包常用场景
    拆包:遍历元组或列表组成的序列遍历元组#先后访问序列seq[0]、seq[1]、seq[2]#(a,b,c=(1,2,3)、(4,5,6)、(7,8,9))seq=[(1,2,3),(4,5,6),(7,8,9)]seq[(1,2,3),(4,5,6),(7,8,9)]fora,b,cinseq:print("d1={0},d2={1},d3={2}".format(a,b,c)) #a指向seq[0]=(1,2......
  • 最大熵原理[解释+例题]
    1熵的概念熵是热力学中的一个概念,由香浓引入到信息论中。在信息论中,熵是衡量随机变量不确定性的量度,熵越大表示随机变量的不确定性越大,即随机变量越难以预测。2熵的计算信息熵的计算可以看笔者的博客:点此跳转。3最大熵原理定义最大熵原理是一种选择随机变量统计特性最符......
  • 9.9 ~ 9.15
    9.9whk正常上课。感觉自己一到教室就困,怎么会是呢总不能是教室人太多缺氧了吧(OI我干啥了?我干啥了?我干啥了?9.10whk教师节。所以每节课上课之前我们都会起立并大喊“祝老师教师节快乐”;然后在奥赛课上也这么干了,给了\(\text{Huge}\)一点小小的震撼;Peppa_Even_Pig喊起......
  • solidworks卸载工具,专用卸载修复工具,一键卸载solidworks ae ai ansys arcgis catia c
    XXClean是一款专业的系统清理工具,旨在帮助用户彻底卸载和清理各种软件残留。它支持广泛的软件列表,aeaiansysArcGlSCatiaCDRCreoDaVinciMastercamMatlabMultisimofficeOriginProepsRhinoSketchupSPSSsolidworksTIAPortalUGNX软件等。以下是XXClean的简介......