checksum-8位和16位校验和代码示例

2023-05-16

// linux 系统编译通过
// gcc filename.c -o filename
// ./filename

#include <stdlib.h>
#include <stdio.h>

unsigned char ip_hdr_8[] = 
{
    0x45,0x00,
    0x00,0x3c,
    0x00,0x00,
    0x00,0x00,
    0x40,0x01,
    0x00,0x00,  // checksum
    0xc0,0xa8,
    0x01,0x25,
    0xda,0x3c,
    0x06,0x82
};

unsigned short ip_hdr_16[] = 
{
    0x4500,
    0x003c,
    0x0000,
    0x0000,
    0x4001,
    0x0000,     // checksum
    0xc0a8,
    0x0125,
    0xda3c,
    0x0682
};

unsigned int checksum_8(unsigned int cksum, void *pBuffer, unsigned int size)
{
    char num = 0;
    unsigned char *p = (unsigned char *)pBuffer;

    if ((NULL == pBuffer) || (0 == size))
    {
        return cksum;
    }

    while (size > 1)
    {
        cksum += ((unsigned short)p[num] << 8 & 0xff00) | (unsigned short)p[num + 1] & 0x00FF;
        size  -= 2;
        num   += 2;
    }

    if (size > 0)
    {
        cksum += ((unsigned short)p[num] << 8) & 0xFFFF;
        num += 1;
    }

    while (cksum >> 16)
    {
        cksum = (cksum & 0xFFFF) + (cksum >> 16);
    }

    return ~cksum;
}


unsigned short checksum_16(unsigned short *addr,int len)
{
    unsigned short chksum;
    unsigned int sum = 0;

    while(len > 1)
    {
        sum += *addr++;
        len -= 2;
    }

    if(len == 1)
        sum += *(unsigned char*)addr;

    sum = (sum>>16) + (sum & 0xffff);
    sum += (sum>>16);
    chksum = ~sum;
    return (chksum);
}

void main()
{
    unsigned short chksum;

    printf("--------------------------------------------\n");

    chksum = checksum_8(0,ip_hdr_8,sizeof(ip_hdr_8));
    printf("checksum_8 = 0x%04x \n",chksum);
    ip_hdr_8[10] = chksum >> 8;
    ip_hdr_8[11] = chksum & 0xff;

    chksum = checksum_8(0,ip_hdr_8,20);
    if(chksum)
        printf("Checksum_8 is incorrect! \n");
    else
        printf("Checksum_8 is correct! \n");

    printf("--------------------------------------------\n");

    chksum = checksum_16(ip_hdr_16,sizeof(ip_hdr_16));
    printf("checksum_16 = 0x%04x \n",chksum);
    ip_hdr_16[5] = chksum;

    chksum = checksum_16(ip_hdr_16,20);
    if(chksum)
        printf("Checksum 16 is incorrect! \n");
    else
        printf("Checksum 16 is correct! \n");

    printf("--------------------------------------------\n");
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

checksum-8位和16位校验和代码示例 的相关文章

  • 子类以private方式继承父类

    子类以private方式继承父类 xff0c 则父类的pubic protected接口在子类变为private接口 xff0c 而父类的private接口在子类变为不可访问的接口 xff0c 而且不存在子类到父类的转换 所以子类以priv

随机推荐

  • CNN实战之如何分析影评-好看又有趣的讲解

    CNN实战之如何分析影评 好看又有趣的讲解 前言认识影评数据集了解TextCNN模型获取影评数据生成文本数据集生成TextCNN模型评估模型 前言 话说老王买了两张电影票打算请女神小丽去看电影 xff0c 老王希望看完电影趁着热度可以和小丽
  • 无人驾驶时代的室外组网技术研究

    无人驾驶时代的室外组网技术研究 车载自组网车载自组网简介车载自组网特点车载自组网组成及建构 主流自组网通信方式ZigBeeWIFIBlue ToothWiMAXDSRC4G 5G 参考文献 车载自组网 车辆通信网络就是在汽车上装载移动通信设
  • 这本关于机器学习的书---牛XXX

    机器学习好书推荐 如图所示 xff0c 这是一本可读性非常强 xff0c 非常有趣的一本介绍机器学习概率论的书 xff0c 让人看了会上瘾 看到这里 xff0c 作者摊牌了 本书作者即本人
  • ROS下运行rqt报错

    解决方案 xff1a 从上面可以看到ROS是通过python2 7编译 xff0c 查看自己python版本 xff0c 修改为对应版本即可成功运行rqt和rqt graph
  • zed2相机SDK安装及ROS安装

    一 安装相机SDK 相机SDK即相机的软件开发工具包 1 查看CUDA版本 xff1a nvcc version 2 相机SDK xff08 Software Development Kit xff09 下载网址 xff1a ZED SDK
  • zed2相机标定

    一 标定相机 1 刷新ros工作空间 source devel setup bash 2 打开相机ros节点 roslaunch zed wrapper zed2 launch 3 准备棋盘格标定板 xff0c 修改标定板checkboar
  • zed2相机标定(IMU)

    二 IMU标定 陀螺仪模型 xff1a 其中 xff0c 为陀螺仪测量值 xff1b 为陀螺仪真实值 xff1b 为陀螺仪零偏 xff08 也叫偏置 xff09 xff1b 为陀螺随机噪声项 xff08 包括白噪声和随机游走噪声 xff09
  • zed2相机标定(相机+imu)

    相机和imu单独标定请参考前面的博客 1 准备文件 checkboard yaml相机标定文件camera calibration yamlimu标定文件imu calibration yaml IMU标定文件格式需要改为如下 xff1a
  • Opencv中三个光流跟踪函数

    在slam里 xff0c 光流跟踪判断图像中某一物体的动态性 xff0c 主要包括3个函数 xff1a 1 goodFeaturesToTrack函数 作用 xff1a 提取输入图像中像素级别的角点 xff0c 支持harris角点和Shi
  • 算法:二分查找

    给定一个n个元素有序的 xff08 升序 xff09 整型数组 nums 和一个目标值 target xff0c 写一个函数搜索 nums 中的 target xff0c 如果目标值存在返回下标 xff0c 否则返回 1 1 条件 查找的数
  • 一行代码解决selenium进入抖音出现验证滑块

    我正常从浏览器进入抖音是不出现验证滑块的 xff0c 然后用selenium进入抖音网站发现会出现滑块验证 如下如这是原代码 xff1a 运行代码后就会发现浏览器出现验证滑块 xff0c 这是是因为网站识别出你是使用selenium 这个时
  • 激光点云有关目标检测与目标跟踪的消息定义

    1 jsk recognition msgs BoundingBoxArray msg 安装jsk recognition msgs xff1a sudo apt get install ros melodic jsk recognitio
  • Linefit_ground_segmention文章梳理及代码阅读

    2013年专门针对地面分割的文章 xff1a Fast segmentation of 3D point clouds for ground vehicles 代码链接 xff1a https github com lorenwel lin
  • 使用MFC+GDI编写地图编辑器补充

    使用MFC 43 GDI编写地图编辑器补充 小宝乱猜 在编写MapEdit时我遇到一个问题 xff0c 那就是在程序开始时一切正常 xff0c 但在打开一个地图文件后 xff0c 程序就会因找不到资源文件而画面混乱 调试了半天才发现是相对路
  • 基于select模型的TCP服务器

    之前的一篇博文是基于TCP的服务器和客户机程序 xff0c 今天在这我要实现一个基于select模型的TCP服务器 xff08 仅实现了服务器 xff09 socket套接字编程提供了很多模型来使服务器高效的接受客户端的请求 xff0c s
  • 路由器端口介绍

    路由器所在的网络位置比较复杂 xff0c 既可是内部子网边缘 xff0c 也可位于内 外部网络边缘 同时为了实现强大的适用性 xff0c 它需要连接各种网络 xff0c 这样 xff0c 它的接口也就必须多种多样 对于这些 xff0c 不要
  • 光流(Optical Flow)

    光流的概念 光流是一种描述像素随时间在图像之间运动的方法 随着时间流逝 同一个像素会在图像中运动 我们希望追踪他的运动过程 稀疏光流 计算部分像素 稠密光流 计算全部像素 稀疏光流以Lucas Kanade光流为代表 简称LK光流 光流的两
  • 模块化程序 点与圆的关系 类中成员函数的声明和实现分开写入头文件和源文件中

    64 TOC 模块化程序 点和圆的关系 在黑马程序员课程4 1 3成员属性设置为私有 课后案例 点和圆的关系中 谈到了文件的封装 此案例是判断点与圆的关系 xff0c 重点是以另外一个类作为本类中的成员 xff1b 在比较大的开发中 xff
  • c++模板类/模板函数的声明与定义应该放在头文件里

    如果函数模板按照普通的函数声明放在头文件的 xff0c 定义放在 cpp文件 xff0c 会出现错误 xff1a 模板函数声明 定义 引用有什么要注意的问题么 xff1f xff1f mylib h template lt class T
  • checksum-8位和16位校验和代码示例

    span class hljs comment linux 系统编译通过 span span class hljs comment gcc filename c o filename span span class hljs comment