checksum算法详细的计算方法、实现思路与python校验验证

2023-05-16

1.checksum是什么?

Checksum:【电脑】总和检验码,校验和。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。
它通常是以十六进制为数制表示的形式
通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性


2.计算方法

1、 先将需要计算checksum数据中的checksum设为0;
2、 计算checksum的数据按2byte划分开来,每2byte组成一个16bit的值,如果最后有单个byte的数据,补一个byte的0组成2byte;
3、 将所有的16bit值累加到一个32bit的值中;
4、 将32bit值的高16bit与低16bit相加到一个新的32bit值中,若新的32bit值大于0Xffff,
再将新值的高16bit与低16bit相加;
5、 将上一步计算所得的16bit值按位取反(取反是取补码),即得到checksum值,存入数据的checksum字段即可。


3.算法实现的具体思路

参考的别的大佬的文章,数据拿过来

 45 00 00 30 80 4c 40 00 80 06 b5 2e d3 43 11 7b cb 51 15 3d

1、第一步,checksum数据中的checksum=b52e设为0

遍历需要校验的数据,将checksum替换为0

45 00 00 30 80 4c 40 00 80 06 00 00 d3 43 11 7b cb 51 15 3d

2、第二步,求和

遍历求和,直接累加,最后输出的是一个int类型的十进制数

3、第三步,转十六进制,将进位添加到低位

python提供了直接将十进制数转为十六进制的内置函数:hex()    返回的是str型   例如:hex(12345)

4500+0030+804c+4000+8006+0000+d343+117b+cb51+153d=0x34ace

将进位(3)加到低16位(4ace)上:0003+4ace=4ad1

4、第四步,取反码
 将4ad1取反得:checksum=b52e


4、使用python实现checksum算法

代码没有整理简化,

'''
自定义checksum算法实现

checksum:校验和
data:需要校验的数据
'''
import math
import numpy as np

class myCheckSum():
    def __init__( self,checkSum,data=[] ):
        self.checkSum=checkSum
        self.data=data
        self.hexadecimal={ 'a':10, 'b':11, 'c':12, 'd':13, 'e':14,  'f':15,
                          10:'a', 11:'b', 12:'c', 13:'d', 14:'e', 15:'f'}      #  十六进制大于9的数
        self.sumdata=0x0 
        
        #第一步,求和(遍历时遇到checksum,替换为0x0)
        datas=self.sumCheckSum()
        
        #第二步,将进位加到低位
        cal=self.carryAddLow( len(self.sumdata),datas ) # len(self.sumdata)=5     cal=0x4ad1
        
        #第三步,取补码
        result=self.complementData(cal)
        print('result:',result)
        print('checksum:',checkSum)   #   checkSum: 46382
        if result==checkSum:
            print('True:正确')
        else:
            print('False:错误')
        
        
    # 求和    
    def sumCheckSum(self):
        dataLen=len(self.data)  
               
        for i in range(dataLen): 
            if self.data[i]==self.checkSum:  # 找到checksum
                self.sumdata+=0x0   #  checksum替换为0x0来累加
            else:
                self.sumdata+=self.data[i]
        #print( type( sel.SumData ) )      #  215758  <class 'int'>  int型  
        self.sumdata=hex(self.sumdata)[2:]     #  '0x34ace'    str类型   十六进制    
        
        datas=[]
        for i in self.sumdata:
            if i in ['a','b','c','d','e']:
                datas.append( self.hexadecimal[i] )
            else:
                datas.append( int(i) )        
        #print( 'datas:',datas)    #  ['3','4','10','12','14']
        return datas
     
        
    # 取反 ,这里取反取的是补码   在python中 ~ 不能取到补码
    def complementData(self,cal):                   
        tenResult=int(cal,16)
        twoResult=bin(tenResult)
        
        calLen=len( cal[2:])  #  4
        twoResultLen=len( twoResult[2:])    #   15        
        if calLen*4>twoResultLen:
            subLen=calLen*4-twoResultLen      #   1
            twoResult='0'*subLen+twoResult[2:]
        #print( 'twoResult:',twoResult ,'*type:',type(twoResult))    # twoResult: 0100101011010001 *type: <class 'str'>
        
        reverseResult='0b'
        for i in twoResult:
            if i=='1':
                reverseResult+='0'
            else:
                reverseResult+='1'
        #print('reverseResult:',reverseResult)  #  reverseResult: 0b1011010100101110
        #print(hex( eval(reverseResult) ) )      #   0xb52e 
        return eval(reverseResult)    #   46382  十进制
                        
                
        
    #  进位加到低位     返回一个十六进制数        
    #  将32bit值的高16bit与低16bit相加到一个新的32bit值中,若新的32bit值大于0Xffff, 再将新值的高16bit与低16bit相加;       
    def carryAddLow(self,sumDataLen,datas):    #   sumDataLen=5  判断是否大于0Xffff,一种直接数值判断,另一种长度大于0Xffff的四位
        bus,rem=divmod(sumDataLen,4)  # 取bus商  rem余数

        dualLists=[]                   
        if rem != 0:  
            for i in range(bus+1):   # 如果有余数  bus需要+1
                dualLists.append([])   # dualLists=[ [], [], []]
                if i==0:         # 第一个list为 [0,0,0,3]    
                    for j in range(4-rem):  
                        dualLists[i].append(0)
                    for j in range(rem):
                        dualLists[i].append( datas[0] ) 
                        del datas[0]
                else:        
                    for j in range(4):   
                        dualLists[i].append( datas[0] )
                        del datas[0]
        else:
            for i in range(bus):   
                dualLists.append([])     
                for j in range(4):   
                    dualLists[i].append( datas[0] )
                    del datas[0]
        #print( 'dualLists:',dualLists)    #  dualLists: [[0, 0, 0, 3], [4, 10, 12, 14]]
        
        res=[0,0,0,0]
        for i in range( len(dualLists)):
            res=np.array(res)+np.array( dualLists[i] )    #  使用numpy中array把两个list相加    
        #print('res:',res)    #  res: [ 4 10 12 17]    到这里进位加到低位结束
        
        result=[]  
        for i in range( len(res)-1,-1,-1 ):    #  逆序遍历res
            if res[i]>15:    #  大于15的进位  小于等于的直接存了
                result.append( res[i]%16 )
                res[i-1]+=res[i]//15      ###################################################
            else:
                result.append( res[i] )
        #print('result:',result)

        data='0x'
        for i in range( len(result)-1,-1,-1 ):
            if result[i] in [10,11,12,13,14,15]:
                data+=self.hexadecimal[ result[i] ]
            else:
                data+=str( result[i] )
        #print('data:',data)   #   4ad1  
        return data


验证一下

(1)反码求和

4500+0030+804c+4000+8006+b52e+d343+117b+cb51+153d=3fffc
0003+fffc=ffff

(2)取反码:~ffff=0 正确

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

checksum算法详细的计算方法、实现思路与python校验验证 的相关文章

  • restframework权限,认证,限流配置

    认证Authentication DRF框架的默认全局认证方案如下 REST FRAMEWORK 61 39 DEFAULT AUTHENTICATION CLASSES 39 39 rest framework authenticatio
  • seek()方法的使用

    seek xff08 xff09 方法的使用 seek 方法用于移动文件读取指针到指定位置 file seek 方法标准格式是 xff1a file seek offset whence offset xff1a 开始的偏移量 xff0c
  • 为什么QQ用的是UDP协议而不是TCP协议?

    QQ既有UDP也有TCP xff01 不管UDP还是TCP xff0c 最终登陆成功之后 xff0c QQ都会有一个TCP连接来保持在线状态 这个TCP连接的远程端口一般是80 xff0c 采用UDP方式登陆的时候 xff0c 端口是800
  • 五分钟读懂TCP 协议——TCP协议简介

    TCP 是互联网核心协议之一 xff0c 本文介绍它的基础知识 一 TCP 协议的作用 互联网由一整套协议构成 TCP 只是其中的一层 xff0c 有着自己的分工 xff08 图片说明 xff1a TCP 是以太网协议和 IP 协议的上层协
  • JSON模块基本使用

    usr bin python3 coding utf 8 import json json loads 把json字符串转成 python 对象 json string 61 39 39 39 34 a 34 34 x 34 34 b 34
  • c语言中return的各种用法 建议收藏

    按初学的理解 xff0c return的任务就是返回对应的参数 xff0c 在外层函数中对这个参数做进一步处理 实际上return的用法不只这些 为调用的函数返回参数值 此类应用最为普遍 xff0c 通常是在一个具有返回值的函数中 xff0
  • chatgpt的原理 第一部分

    前言 这两天 xff0c ChatGPT模型真可谓称得上是狂拽酷炫D炸天的存在了 一度登上了CSDN热搜 xff0c 这对科技类话题是非常难的存在 不光是做人工智能 机器学习的人关注 xff0c 而是大量的各行各业从业人员都来关注这个模型
  • 自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第一部分

    我是去年9月22日才正式学习Java的 xff0c 因为在国营单位工作了4年 xff0c 在天津一个月工资只有5000块 xff0c 而且看不到任何晋升的希望 xff0c 如果想要往上走 xff0c 那背后就一定要有关系才行 而且国营单位的
  • 自学5个月Java找到了9K的工作,我的方式值得大家借鉴 第二部分

    我的学习心得 xff0c 我认为能不能自学成功的要素有两点 第一点就是自身的问题 xff0c 虽然想要转行学习Java的人很多 xff0c 但是非常强烈的想要转行学好的人是小部分 而大部分人只是抱着试试的心态来学习Java xff0c 这是
  • 深入理解任务堆栈以及堆栈溢出

    前言 xff1a 在多任务操作系统中创建任务时 xff0c 都需要指定该任务的堆栈大小 xff0c 那么这个堆栈的作用时什么呢 xff1f 什么情况下需要用到堆栈 xff0c 以及大小不够时会产生什么异常呢 xff1f 1 任务状态 简单分
  • 计算机网络的166个概念你知道几个 第四部分

    HTML xff1a HTML 称为超文本标记语言 xff0c 是一种标识性的语言 它包括一系列标签 xff0e 通过这些标签可以将网络上的文档格式统一 xff0c 使分散的 Internet 资源连接为一个逻辑整体 HTML 文本是由 H
  • 15000 字的 SQL 语句大全 第一部分

    一 基础 1 说明 xff1a 创建数据库CREATE DATABASE database name 2 说明 xff1a 删除数据库drop database dbname 3 说明 xff1a 备份sql server 创建 备份数据的
  • 毕业设计源码基于springboot的旧物置换系统的实现

    摘 要 随着时代在一步一步在进步 xff0c 旧物也成人们的烦恼 xff0c 许多平台网站都在推广自已的产品像天猫 咸鱼 京东 所以开发出一套关于旧物置换网站成为必需 旧物置换网站主要是借助计算机 xff0c 通过对用户进行管理 为减少管理
  • 毕业设计源码基于Spring Boot的论坛管理系统的实现

    摘要 xff1a 在社会快速发展的影响下 xff0c 论坛管理系统 继续发展 xff0c 使 论坛管理系统 的管理和运营比过去十年更加 信息化 依照这一现实为基础 xff0c 设计一个快捷而又方便的网上 论坛管理系统 是一项十分重要并且有价
  • 毕业设计源码基于Spring Boot的旅游管理系统的实现

    摘 要 社会的发展和科学技术的进步 xff0c 互联网技术越来越受欢迎 网络计算机的 交易 方式逐渐受到广大人民群众的喜爱 xff0c 也逐渐进入了每个 用户 的使用 互联网具有便利性 xff0c 速度快 xff0c 效率高 xff0c 成
  • 轮询、中断和DMA三种方式的原理和联系

    CPU控制外部设备的方式 xff1a 中断 轮询 DMA 轮询中断DMA 由于外部设备的速度差异 xff0c CPU可以使用不同的方式控制外部设备的访问 常见的方式轮询 中断和DMA 轮询 轮询最简单 xff0c CPU通过不断地查询某个外
  • OpenMV识别色块与STM2F4通过串口通信

    花了三天时间学习了一下OpenMV的简单使用 xff0c 在这写个博客记录一下 xff0c 并且上传自己的代码 xff0c 以方便交流学习 第一次发帖 xff0c 不周之处见谅 首先概括一下我实现的功能 xff1a OpenMV识别红色色块
  • c++语言简单提问

    1 定义一个空的类型 xff0c 里面没有任何成员变量和成员函数 对该类型求sizeof xff0c 得到的结果是 1 2 为什么不是0 空类型的实例中不包含任何信息 xff0c 本来求sizeof应该是0 xff0c 但是当我们声名该类型
  • 二 ROS通信机制-话题通信(发布订阅模式)

    二 ROS通信机制 话题通信 发布订阅模式 ROS 中的基本通信机制2 1话题通信 发布订阅模式 2 1 1概念2 1 2作用2 1 3 理论模型2 1 4 话题通信应用时需要关注的地方 xff1a 3 简单实现3 1ROS工作空间建立 x
  • 解决ROS中运行launch文件报错ERROR: cannot launch node of type[xxx/xxx]:xxx的问题

    解决ROS中运行launch文件报错ERROR cannot launch node of type xxx xxx xxx的问题 错误截图 xff1a 原因 xff1a 解决方式 xff1a 当时我出现的错误是 ERROR cannot

随机推荐

  • c++ stl 五种迭代器

    c 43 43 stl 五种迭代器 2010 12 31 14 22 25 分类 xff1a C 43 43 C 举报 字号 订阅 下载LOFTER 我的照片书 迭代器的分类 Iterator Categories I
  • C语言头文件中定义变量问题(转)

    上个星期回学校的时候 xff0c 刚好碰到一个学弟在写程序 xff0c 并且刚好碰到一个总编不过去的问题 xff0c 我看了看 xff0c 正好是个头文件重复包含问题 xff0c 问题描述如下 xff1a 他在程序中建立了一个global
  • Opencv Aruco识别(python)

    效果图 先上效果 代码 直接上代码 xff1a span class token operator span span class token operator span usr span class token operator span
  • Windows下Cmake安装步骤详解(图文)

    文章目录 Cmake介绍Cmake下载及安装 Cmake介绍 CMake是一个跨平台的安装 xff08 编译 xff09 工具 xff0c 可以用简单的语句来描述所有平台的安装 编译过程 xff0c 并且输出对应的makefile或者pro
  • C语言:通过指针模拟实现strcat函数

    模拟实现strcat strcat函数的功能 把src所指向的字符串 xff08 包括 0 xff09 复制到dest所指向的字符串后面 xff08 删除dest原来末尾的 0 xff09 要保证dest足够长 xff0c 以容纳被复制进来
  • C语言中将字符串拆分再进行拼接

    我们有时候需要对于字符串进行操作 xff0c 主要用到strcat和strtok两个函数 xff0c 因此记录下这次的操作方式以便之后查阅 span class token macro property span class token d
  • 并行编程实现矩阵乘法优化

    实现四种矩阵乘法程序 xff0c 并对比运行效率 1 xff09 串行算法 2 xff09 Catch优化 3 xff09 SSE版本 4 xff09 分片策略 span class token macro property span cl
  • c++的函数reserve()和unique()和sort()

    函数reserve span class token comment vector reserve span span class token macro property span class token directive keywor
  • 关于c中代码加 ‘\‘ 进行换行的说明

    我们在c与c 43 43 中经常会遇到一种情况就是加 进行换行来保持代码整体结构一致的使用情况 xff0c 那么具体来说换行的规则是什么 xff0c 这里进行一下记录 span class token macro property span
  • git的命令总结

    先把清单列出来git cheat sheet git 命令总结 git的init和git clonegit add和git commit 提交二连git checkout 反向操作git reset 回退HEAD指针git revert 同
  • 宏定义中的可变参数 __VA_ARGS__ 用法 与 #和##的用法

    首先了解一下可变参数 span class token macro property span class token directive keyword include span span class token string lt st
  • C++结构体简单链表原理解释

    对结构体简单链表原理的简单解释 xff0c 程序如下 xff1a struct lianbiao int no string name struct lianbiao next lianbiao head 61 nullptr tail 6
  • linux小连招

    Linux命令目录 查看当前shell的种类find命令查找文件 查看当前shell的种类 查看当前发行版可以使用的shell xff1a chao 64 chao span class token function cat span et
  • 侵略性奶牛(对于二分的总结)

    题目 Farmer John has built a new long barn with N 2 lt 61 N lt 61 100 000 stalls The stalls are located along a straight l
  • To Fill or Not to Fill(贪心算法)

    题目描述 有了高速公路 xff0c 开车从杭州到任何其他城市都很容易 但由于汽车的油箱容量有限 xff0c 我们必须不时地在路上找到加油站 不同的加油站可能会给出不同的价格 你被要求仔细设计最便宜的路线去 输入描述 对于每个测试实例 第一行
  • cmake语法

    目录 基本语法命令行projectadd executabletarget sourcessetfileadd librarymessagetarget link librariestarget include directoriesfin
  • 《C++个人学习笔记》使用cout或cin显示未定义标识符

    在vs自动生成的c 43 43 项目中 xff0c 初次使用cout或cin报未定义标识符错误 xff0c 是由于未声明命名空间的原因 解决方法 xff1a 在头文件中声明全局命名空间 加入 using namespace std 表示使用
  • rosbag error

    rosbag play 报错 error 1 md5sum span class token punctuation span span class token constant ERROR span span class token pu
  • CMake实践(三)静态库和动态库构建

    本节的任务是 xff1a 建立一个静态库和动态库 xff0c 提供HelloFunc函数供其他程序使用 xff0c HelloFunc函数向终端输出Hello World字符串 安装头文件和共享库 1 准备工作 在 backup cmake
  • checksum算法详细的计算方法、实现思路与python校验验证

    1 checksum是什么 xff1f Checksum xff1a 电脑 总和检验码 xff0c 校验和 在数据处理和数据通信领域中 xff0c 用于校验目的的一组数据项的和 这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串