网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

用C/C++语言编写的程序,用于实现CHECKSUM功能。

更新时间:2026年03月27日   作者:spoto   标签(Tag):

校验和是一种错误检测机制,它能够在数据或消息从发送方传输到接收方的过程中发现其中的错误。这种机制由上层协议所使用,它利用了发送方的校验和生成器以及接收方的校验和检查器来检测错误。

示例:

输入:sent_message = “10101111”,rec_message = “10101101”,block_size = 8
输出结果:错误/失误
说明:由于 sent_message 和 rec_message 中的第7位不同,因此最终的校验和值不等于0。这表明在传输过程中发生了某种错误。

输入:sent_message = “10000101011000111001010011101101”, rec_message = “10000101011000111001010011101101”, 块大小 = 8
输出结果:无错误

接近方式:给定的问题可以划分为以下两个部分:

  • 生成校验和值。发件人的消息可以按照以下步骤来完成:
    • 将消息分解为给定的二进制字符串。块大小.
    • 所有的二进制字符串都被加在一起,从而得到最终的结果。总和.
    • 表示该二进制字符串的“一的补码”总和这就是所需的校验和值。
  • 请检查该值是否正确。已接收的消息即/也就是说rec_message + 发送者校验和)等于 0.
    • 接收到的消息的校验和,可以像上述过程中计算校验和那样来进行计算。
    • 如果校验和值符合以下条件:0消息的传输是正常的,没有出现任何错误。不过,在传输过程中还是发生了一些错误。

以下是上述方法的实现过程:

C++
// 上述方法的C++实现方式#include<bits/stdc++.h>使用命名空间标准;// 用于计算一的补码的函数// 给定二进制字符串中的内容字符串补数运算(字符串数据){为了(整数i=0;i<数据.长度();i++){if(数据[i]==‘0’)数据[i]=“1”;否则数据[i]=‘0’;}返回数据;}// 该函数用于返回校验和值。// 当将给定的字符串分割成大小为 K 的块时,所得到的字符串就是这样的结果。字符串校验和(字符串数据,整数块大小){// 检查数据大小是否能被 block_size 整除// 否则,在数据前面加上 ‘0’。整数n=数据.长度();if(n%块大小!=0){整数填充大小=块大小-(n%块大小);为了(整数i=0;i<填充大小;i++){数据=‘0’+数据;}}// 对所有块进行二进制加法运算,同时考虑进位情况字符串结果="";// 存储在result变量中的数据,位于第一个数据块中为了(整数i=0;i<块大小;i++){结果+=数据[i];}// 循环以计算该块的值// 数据的巧妙处理/合理运用为了(整数i=块大小;i<n;i+=块大小){// 存储下一个数据块的数据字符串下一个块="";为了(整数j=i;j<i+块大小;j++){下一个块+=数据[j];}// 存储两个数据块进行二进制加法运算的结果字符串添加内容/要素="";整数总和=0,携带=0;// 循环计算二进制加法的结果// 当前有两个大小为 k 的块为了(整数k=块大小-1;k>=0;k--){总和+=(下一个块[k]-‘0’)+(结果[k]-‘0’);携带=总和/2;if(总和==0){加法=‘0’+加法;总和=携带;}否则if(总和==1){添加内容/要素=1+添加内容/要素;总和=携带;}否则if(总和==2){添加内容/元素=‘0’+加法;总和=携带;}否则{添加内容/要素=“1”+添加内容/元素;总和=携带;}}// 在将两个包含进位的数据块进行二进制相加之后// 如果进位为1,则进行二进制加法运算。字符串最终/最后="";if(携带==1){为了(整数l=加法.长度()-1;l>=0;l--){if(携带==0){最终/最后=添加/增加[l]+最终/最后;}否则if(((添加内容/要素[l]-‘0’)+携带)%2==0){最终/最后=“0”+最终/最后;携带=1;}否则{最终/最后=1+最终/最后;携带=0;}}结果/成果=最终/最后;}否则{结果/成果=添加/补充;}}// 返回结果值的补数// 该值表示所需的校验和数值。返回补数运算(结果);}// 用于检查接收到的消息是否有效的函数// 与发送者的消息相同。布尔值检查员(字符串发送的消息,字符串回复消息,整数块大小){// 检查发送方消息的校验和值字符串发送方校验和=校验和(发送的消息,块大小);// 接收方消息的校验和值字符串接收者校验和=校验和(回复消息+发送方校验和,块大小);// 如果接收方的校验和值为0if(计数(接收者校验和.开始(),接收者校验和.结束(),‘0’)==块大小){返回真的/正确的;}否则{返回错误的/不正确的;}}// 驱动程序代码整数主要/核心(){字符串发送的消息=10000101011000111001010011101101;字符串接收消息=10000101011000111001010011101101;整数块大小=8;if(检查员(发送的消息,接收消息,块大小)){cout<<“无错误”;}否则{cout<<“错误”;}返回0;}

输出结果/内容
No Error

时间复杂度:O(N)
辅助空间:O(块大小)

              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料