首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

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

编程知识
2024年07月22日 09:21

介绍:
检验和(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;
}
From:https://www.cnblogs.com/l-xx123/p/18237938
本文地址: http://shuzixingkong.net/article/280
0评论
提交 加载更多评论
其他文章 【译】用 GitHub Copilot 提交注释揭开历史的神秘面纱
您是否曾经难以理解一个提交在做什么或者为什么要做?在审查或协作代码更改时,您是否希望有更多的清晰度和上下文?如果您的回答是肯定的,那么您会喜欢 GitHub Copilot 为您所做的——生成提交注释。GitHub Copilot 可以分析您的代码差异,并生成简洁的总结,突出重点。没有更多的猜测或浪
【译】用 GitHub Copilot 提交注释揭开历史的神秘面纱 【译】用 GitHub Copilot 提交注释揭开历史的神秘面纱
Ubuntu本地安装Docker
Ubuntu本地安装Docker 目录Ubuntu本地安装Docker查看Ubuntu系统版本代号安装修改镜像源 官方文档:Install Docker Engine on Ubuntu | Docker Docs Ubuntu18.04 Docker安装包 Ubuntu20.04 Docker安装
Ubuntu本地安装Docker Ubuntu本地安装Docker
安装量终于破千了!聊聊浏览器扩展开发的相关问题与解决方案
浏览器扩展开发的相关问题与解决方案 我开发的浏览器扩展安装量终于过千了!在 Firefox AddOns 已经有2.1k+安装,在 Chrome WebStore 已经有2k+安装。实际上在Firefox的扩展市场里是周平均安装量,当天的实际安装量要高出平均值不少,而Chrome的扩展市场在超过1k
C# 网络编程:.NET 开发者的核心技能
前言 数字化时代,网络编程已成为软件开发中不可或缺的一环,尤其对于 .NET 开发者而言,掌握 C# 中的网络编程技巧是迈向更高层次的必经之路。无论是构建高性能的 Web 应用,还是实现复杂的分布式系统,网络编程都是支撑这一切的基石。 本篇主要为 .NET 开发者提供一份全面而精炼的 C# 网络编程
C# 网络编程:.NET 开发者的核心技能
如何用 WinDbg 调试Linux上的 .NET程序
一:背景 1. 讲故事 最新版本 1.2402.24001.0 的WinDbg真的让人很兴奋,可以将自己伪装成 GDB 来和远程的 GDBServer 打通来实现对 Linux 上 .NET程序进行调试,这样就可以继续使用熟悉的WinDbg 命令,在这个版本中我觉得 WinDbg 不再是 WinDb
如何用 WinDbg 调试Linux上的 .NET程序 如何用 WinDbg 调试Linux上的 .NET程序 如何用 WinDbg 调试Linux上的 .NET程序
前端体验优化(5)——后台
从 0 开始搭建一套后台管理系统,成本巨大,所以都会选择一套成熟的组件库,基于此,再堆叠业务逻辑。我们公司的组件库基于 Ant Design。Ant Design 包含一套完整的后台解决方案,不仅提供了 75 个组件,还开源了整套设计方案,配色、字体、图标、布局等,还分享了众多的用户体验案例。官方基
前端体验优化(5)——后台 前端体验优化(5)——后台 前端体验优化(5)——后台
上周热点回顾(7.15-7.21)
热点随笔: &#183;&#160;求救信:救下园子,保住这块开发者的天地&#160;(博客园团队)&#183;&#160;给博客园的寄语&#160;(☆№忧忧★♂)&#183;&#160;36岁,大龄剩男,2024上半年总结......&#160;(久曲健)&#183;&#160;我不应该用JWT
技术文档必备工具:注释目录树神器 Annotree,我的第一个正式开源项目
hi,大家好,我是爱听书的程序员阿超 非常开心能在这里介绍我的第一个正式开源项目 Annotree,项目具体情况如下,请继续阅读&#128214;~ Annotree 注释树 一款生成带注释的目录树工具,大大方便技术文档的编写 项目介绍 &#127881; 本项目基于&#160;folder-exp
技术文档必备工具:注释目录树神器 Annotree,我的第一个正式开源项目 技术文档必备工具:注释目录树神器 Annotree,我的第一个正式开源项目 技术文档必备工具:注释目录树神器 Annotree,我的第一个正式开源项目