介绍:

检验和(checksum),在数据处理和数据通信领域中,用于校验目的地一组数据项的和。它通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。(此引用了检验和的百度百科)

用处:

在计算机网络中的网络层、运输层的IP协议、TCP协议、UDP协议等高层协议,在报文中存在一个校验和的字段,这个字段的作用是:验证报文在传输过程中是否被改动,如果接收方检测到检验和有差错,则TCP段会被直接丢弃。如下图在IP报文中占4字节。

原理:

把要发送的数据看成 16 比特的二进制整数序列,并计算他们的和。若数据字节长度为奇数,则在数据尾部补一个字节的 0 以凑成偶数。

例子:

16 位效验和计算,下图表明一个小的字符串的 16 位效验和的计算。为了计算效验和,发送计算机把每对字符当成 16 位整数处理并计算效验和。如果效验和大于 16 位,那么把进位一起加到最后的效验和中。

主要思想为:

1.打开文件,用一个字符串存下里面内容

2.首先判断字符串长度是否为奇数,若为奇数,后面补一个“0”

3.将字符串里面的字符进行读取,并转化成ASCII码对应。每次读取两个字符,也就是每两个为一组。

4.由于字符要化为十六进制后拼接,那么两位里面的前一位将乘于16的平方(256)

5.每一组的十进制数相加

6.先将相加得到的化为2进制存放在int里面,再进行处理,int型里面有32位,我们分为前16位和后16位,对于溢出的在进行处理

而这是现在网上大多数的做法,我现在只是为了更直观,在4、5、6步进行修改

4.由于字符要化为十六进制后拼接,那么两位里面的前一位将乘于16的平方(256),转化成16进制

5.每一组的16进制数相加

6.相加时,超过了0xFFFF(16位最大值),则进行溢出处理。

c++代码

#include <vector>
#include <sstream>
#include <iomanip>
#include <fstream> using namespace std; string to_hex(int value) {
stringstream ss;
ss << hex << value;
return ss.str();
} string add_hex(string hex1, string hex2) {
int num1, num2;
stringstream ss;
ss << hex << hex1;
ss >> num1;
ss.clear();
ss << hex << hex2;
ss >> num2;
int sum = num1 + num2;
if (sum > 0xFFFF) {
sum = (sum & 0xFFFF) + 1; // Add carry to the sum
}
stringstream result;
result << hex << setw(4) << setfill('0') << sum;
return result.str();
} string check(string filename) {
ifstream file(filename);
if (!file.is_open()) {
cout << "无法打开文件" << endl;
exit(0);
}
string chuang;
getline(file, chuang);
if (chuang.size() % 2 == 1) {
chuang += "0";
}
cout << "得到字符串为 " << chuang << endl; vector<int> num;
for (int i = 0; i < chuang.size(); i += 2) {
int value = 0;
value = (int(chuang[i]) * 256) + int(chuang[i + 1]); // Convert 2 characters to int
num.push_back(value);
} string hexchuang;
string sum = "0000"; // Initialize sum as "0000"
for (int i = 0; i < num.size(); i++) {
int value = num[i];
sum = add_hex(sum, to_hex(value));
hexchuang += to_hex(value);
cout << "转化为16进制后为 " << to_hex(value) << endl;
} cout << "转化为16进制后为 " << hexchuang << endl;
return sum;
} int main() {
string command; // 从命令行输入的命令
string filename; // 输入的文件名 cout << "请输入要执行的命令和处理的文件名" << endl;
cin >> command >> filename;
//这样运行check_sum D:/infile.txt while (true) {
if (command.compare("check_sum") != 0) {
cout << "输入命令无效,请重新输入" << endl;
}
else { cout << "最终的16位校验和: " << check(filename) << endl;
break;
}
} return 0;
}

计算机网络中的检验和(checksum)(包括计算文件的检验和附有c++代码)的更多相关文章

  1. 20180711-统计PDB中的蛋白质种类、膜蛋白文件个数及信息等

    20180710完成这份工作.简单,但是完成了还是很开心.在我尝试如何使用pickle保存数据后,尝试保存PDB文件中“HEADER”中的信息.文件均保存于实验室服务器(97.73.198.168)/ ...

  2. powershell中使用Get-FileHash计算文件的hash值

    今天在公司一台windows服务器上.需要对两个文件进行比对,笔者首先就想到了可以使用md5校验 但是公司服务器上又不可以随意安装软件,于是笔者想到了可以试试windows自带的powershell中 ...

  3. OpenCV C++ 计算文件夹中对象文件数目及批量处理后保存到txt文件

    //采用windows控制台实现计算文件夹中对象总数以及批量读取对象 //#include <afx.h> //和windows.h是一样的作用 #include <opencv2/ ...

  4. SharePoint 2010 获取列表中所有数据(包括文件夹内)的方法

    转: http://blog.csdn.net/wangwenism/article/details/8751411 SharePoint的列表能存储文件以及文件夹,用户使用的时候,经常会建几个分类文 ...

  5. 在.NET中计算文件的MD5值

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月2日. 直接上代码吧: using System; using System.IO; using System.Security. ...

  6. -05 08:57 ARCGIS地统计学计算文件后缀名为.shp文件制作

    2011-07-05 08:57 ARCGIS地统计学计算文件后缀名为.shp文件制作 ARCAMP软件要进行地统计计算的文件后格式后缀名必须为.shp的文件,网上介绍的方法复杂难懂,那么制作.shp ...

  7. Visual Studio 项目中添加include, lib, dll库文件(*.h,*.lib,*.dll)

    应用程序使用外部库时需要进行加载,两种库的加载本质上都是一样:提供功能和功能的定义.vs2005 c++ 项目设置外部库方法如下: 1. 添加编译所需要(依赖)的 lib 文件     在“项目-&g ...

  8. net开发过程中Bin目录net开发过程中Bin目录下面几种文件

    .net开发过程中Bin目录下面几种文件格式的解释 在.NET开发中,我们经常会在bin目录下面看到这些类型的文件: .pdb..xsd..vshost.exe..exe..exe.config..v ...

  9. 如何计算UDP/TCP检验和checksum

    如何计算UDP/TCP检验和checksum 一.下面的图是一个UDP的检验和所需要用到的所有信息,包括三个部分:1.UDP伪首部2.UDP首部3.UDP的数据部分(切记不要遗漏该部分,否则就~吐血了 ...

  10. crypto-js计算文件的sha256值

    1. 要在浏览器中计算出文件的sha256或md5值,基本思路就是使用HTML5的FileReader接口把文件读取到内存(readAsArrayBuffer),然后获取文件的二进制内容,然后获取文件 ...

随机推荐

  1. WPF 设置第二次打开程序直接弹出第一次打开的程序

    激活已经打开窗口函数[DllImport("user32.dll")]private static extern bool SetForegroundWindow(IntPtr h ...

  2. ASP.NET Core环境Web Audio API+SingalR+微软语音服务实现web实时语音识别

    处于项目需要,我研究了一下web端的语音识别实现.目前市场上语音服务已经非常成熟了,国内的科大讯飞或是国外的微软在这块都可以提供足够优质的服务,对于我们工程应用来说只需要花钱调用接口就行了,难点在于整 ...

  3. zabbix笔记_003 配置微信告警

    配置邮件告警 安装python-requests,使用微信发送告警 发送告警报错: yum install -y python-requests 测试告警: cat weixin.py #------ ...

  4. 从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践

    本文分享自华为云社区<DTSE Tech Talk × openGemini :从数据库设计到性能调优,全面掌握openGemini应用开发最佳实践>,作者:华为云开源. 在本期<从 ...

  5. 【Socket】解决TCP粘包问题

    一.介绍 TCP一种面向连接的.可靠的.基于字节流的传输层协议. 三次握手: 客户端发送服务端连接请求,等待服务端的回复. 服务端收到请求,服务端回复客户端,可以建立连接,并等待. 客户端收到回复并发 ...

  6. DoNet Core的启动过程-WebApplicationBuilder

    1.前言 在NET6开始做ASP.NETCore的开发,我们首先要看的是启动过程,而WebApplication和WebApplicationBuilder 类是启动过程好不开的类,WebApplic ...

  7. 自建yum源

    自定义yum本地仓库 你不需要依赖外网的yum仓库,可能导致该仓库无法访问,下载软件失败.. 大公司,会自建yum仓库 防止出现网络问题,自建了yum仓库,本地yum仓库 你可以去阿里云上,部署一个在 ...

  8. 天地图添加多个覆盖物,点击切换选中icon

       天地图添加多个覆盖物,点击覆盖物,切换选中的icon,移除之前的icon,再次点击移除之前的... 这个是react写的,先是确定中心位置,然后渲染点位,添加覆盖物,选中icon的不同, 主要看 ...

  9. vue2 混入 (mixin) 带来的小惊喜

    最近在review自己写的代码时发现,在很多的地方都用了以下的代码块 1 async initCode() { 2 const resSource = await this.$API.syscode. ...

  10. AWX+gitlab

    目录 AWX+gitlab 1. Awx配置 1.1 添加机构 1.2 添加团队 1.3 添加主机 1.4 测试主机连通性 2. 对接gitlab 2.1 添加凭证 2.2 添加项目 2.3 上传pl ...