首页 > 编程语言 >C++实现checksum校验和计算

C++实现checksum校验和计算

时间:2022-12-19 19:24:13浏览次数:46  
标签:字节 二进制 checksum 报文 校验 C++ 计算 冗余

校验和概念

  • 差错控制编码是为了检查传输中的错误
  • 下面将一个报文的数据部分称为d,报文的冗余部分称为r
  • 发送方根据约定好的差错控制编码关系(关系指出dr之间的关系)和d生成出r;接收方收到报文后取出d和r,判断是否dr符合约定好的关系
    • 如果不符合关系,说明报文传输过程中出错;否则可以认为没错(不考虑残存错误的可能)
  • 校验和checksum就是约定好的差错控制编码关系中的一种,类似还有奇偶校验,CRC循环冗余
    • 校验和适合软件方式实现,计算速度快,接收方检验的效率也高,CRC和奇偶校验适合硬件实现

发送方校验和计算思路

1.计算和

  • 如果d字节数为奇数,末尾加上一个全0字节,使其为偶数
  • 将d以两字节单位拆分;比如8字节的数据,那么可以拆成4组,每组两字节
  • 每组内部,将两个一字节的二进制表示拼接起来
  • 将每组的二进制表示相加,得到整个报文d部分的和(两字节长度)
    • 如果相加过程中最高位出现了一位进位导致溢出,将进位加在最低位上,此操作称为回卷

2.将和取反,即可得到校验码

示例:UDP计算校验和

  • UDP报文的冗余部分d指的是校验和字段,数据部分d是整个报文除了校验和的字段
    • 之所以把伪头部字段放进d的范围,是为了可以顺带检查伪头部里面的字段是否出错

发送方计算校验和

1.发送方将数据部分d以两字节为单位划分,求和,遇到最高位进位时进行回卷

  • 其中,计算校验和的时候,校验和字段是当作全0去计算的

2.算出和之后取反,将取反后的内容放入校验和字段

  • 此时数据部分d的二进制表示+冗余部分r的二进制表示=二进制全1

接收方验证

1.将收到的报文的d和r取出,验证dr之和是否等于二进制全1

  • r就是校验和字段,d就是除了整个数据包除了校验和的字段
  • 其实不用特意取出,直接计算伪头部和UDP数据报之和即可,因为数据报部分本身就包含了校验和字段呀

c++模拟checksum校验和计算

待更新

标签:字节,二进制,checksum,报文,校验,C++,计算,冗余
From: https://www.cnblogs.com/tangxibomb/p/16992820.html

相关文章

  • C++查看变量类型
    转自:https://blog.csdn.net/Koyurion/article/details/863155321.用法#include<typeinfo>//需要包含头文件typeid(data).name()//打印值:bool:......
  • C++_数组-结构体-枚举-联合体
    C++1.相同类型的数据01.C++数组(array)是一种顺序容器sequencecontainer,是由单一数据类型元素组成的一个有序集合元素类型元素个数数组名称使用......
  • C++ Assert()断言机制原理以及使用
    机器学习以及人工智能的学习需要扎实的数学功底才能走的更远,爬的更高,所以打好数学基础是关键,但无论工作学习都没有充足的时间去拿着书本一个字一个字的去学习了,这里我建议大......
  • 【C++入门】(三)循环结构
    一.while循环循环版的if语句。if语句是判断一次,如果条件成立,则执行后面的语句while是每次判断,如果成立,则执行循环体中的语句,否则停止#include<iostream>using......
  • C++ Primer Plus第三章(操作数据)笔记
    简单变量程序为了将信息储存在计算机中,程序必须记录3个基本属性:信息将储存在哪要存储什么值存储什么类型的信息我们可以利用代码来看看程序到底做了什么:intbrainc......
  • 为什么C++永不过时?
    Linus曾说过:“C++是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它!”这足以说明C++有多难!不过,你也要明白。难度越高意味着含金量与竞争力越高,越能把你和别......
  • 指针都没搞懂,还能算得上 C++ 老司机?
    在工业界,有这样一个规律:“但凡能用其他语言的都不会用C++,只能用C++的必然用C++。”但是,C++的学习和项目开发都比较困难。一个有经验的老手也经常搞出野指针,内存泄露等bug,包......
  • Eclipse下载安装和JDK下载安装(环境配置)及下载C++插件CDT
    一、什么是JDKJDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA......
  • [C++] VS Code 中导入MYSQL (包含使用gcc,g++)
    首先安装Gcc1.下载链接:https://sourceforge.net/projects/mingw-w64/files/备用网盘: https://pan.baidu.com/s/1trdQtDO6XqmfCbZHc1IDzQ?pwd=nwh5 2.添加环境变......
  • C++数学与算法系列之排列和组合
    1.前言本文将聊聊排列和组合,排列组合是组合学最基本的概念,在程序运用中也至关重要。排列问题:指从给定个数的元素中取出指定个数的元素进行排序。组合问题:指从给定个......