精华内容
下载资源
问答
  • 常用校验算法
    万次阅读
    2019-11-19 14:09:43

    1、异或和

      异或和就是对数据逐一异或计算(异或结果与下一个数据异或)

      下面是校验实例

    local rdbuf = "FFFF28000000000000600001000D0000000000000000000000000000000000000000000000000000000096" local fast = string.sub(rdbuf, 5, string.len(rdbuf)-2) local last = string.sub(rdbuf, string.len(rdbuf)-1, string.len(rdbuf)) local num = bit.bxor(tonumber(string.sub(fast, 1, 2), 16), tonumber(string.sub(fast, 3, 4), 16)) --异或 local length = string.len(fast) - 1 for i = 5, length, 2 do num = bit.bxor(num, tonumber(string.sub(fast, i, i+1), 16)) end if num == tonumber(last, 16) then 校验成功 end

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    	char text[100];
    	int i,j,key;
    	printf("输入明文:");
        for(i=0; i<100; i++){
            text[i] = getchar();
            if(text[i] == '\n'){
                text[i] = '\0';
                break;
            }
        }
        printf("输入密钥:");
        scanf("%d",&key);
        printf("加密:");
        for(j=0;j<i;j++){
            text[j] = text[j] ^ key;
        }
        puts(text);
        printf("解密:");
        for(j=0;j<i;j++){
            text[j] = text[j] ^ key;
        }
        puts(text);
        return 0;
    }

     

     

    2、累加和

      累加和也是逐一累加,但是计算不进位,所以最终结果其实是累加结果求256的余数

      下面是计算实例

    local cmd = 10
    cmd = string.format("%02X",cmd) -- 02X 是为了保留两位,空位置0   例如(A是0A)
    local fast = "18000000000000600001000200".. cmd .."00000000000000010006"
    local length = #fast - 1  
    local num = 0
    for i = 1, length, 2 do
        num = num + tonumber(string.sub(fast, i, i+1), 16)  
    end 
    num = num % 256
    num = string.format("%02X",num)
    local instruction = "FFFF" .. fast .. num
    
    print(instruction)

    转载链接

    更多相关内容
  • 常用校验算法

    2022-06-21 10:27:55
    常用校验算法:CRC16,和校验

    一、CRC16/MODBUS

    const uint16_t polynom = 0xA001;
     
    uint16_t crc16bitbybit(uint8_t *ptr, uint16_t len)
    {
    	uint8_t i;
    	uint16_t crc = 0xffff;
    	if (len == 0) 
    	{
    		len = 1;
    	}
    	while (len--) 
    	{
    		crc ^= *ptr;
    		for (i = 0; i<8; i++)
    		{
    			if (crc & 1) 
    			{
    				crc >>= 1;
    				crc ^= polynom;
    			}
    			else
    			 {
    				crc >>= 1;
    			 }
    		}
    		ptr++;
    	}
    	return(crc);
    }
    

    二、和校验/异或校验

    /* 异或校验 */ 
    uint8_t CheckXOR(uint8_t *Buf,uint16_t Len)
    {
      uint8_t x =0;
      
      for(int i=0; i<Len; i++)
      {
        x = x^(*(Buf+i));
      }
      return x;
    }
    
    展开全文
  • 用MFC编写的数据包校验与常用校验算法(数据处理方法与串口通信用户层协议的编制)。编写的代码部分都有中文注释,对刚开始接触MFC的学习者来说是很好的资源!
  • 包含CRC、BASE64、MD5、SHA512加密算法,SHA512需要GLIBC支持
  • 由上面的例子,我们可以知道算法的目的是:使累加和和校验值相加得到一个二进制下每一位都是 1 的结果,这个结果很明显很好处理,这种算法实现起来也很简单,下面给出 C 语言的代码示例。 发送方:以下是如何得到...

    “我这一生都是坚定不移的唯物主义者,唯有你,我希望有来生。”

    – 周恩来

    一、概述

    因为我们所处的环境之中,存在各种或强或弱的信号,这些不速之客总会对电路存在或多或少的干扰,尤其是对于数字信号,很可能会导致传输的数据变得与原来相差甚远。

    对于很多注重安全的场合,尤其是一些数据可能会影响一些硬件的动作(诸如嵌入式的一些设备、机器人的控制等),错误的数据可能会带来一些比较严重的风险,不进行适当的检测和约束,可能会造成严重的安全事故。

    如何避免这种意外事故呢?很容易想到两点:纠正错误数据和放弃错误数据。本文所讲的就是如何利用校验算法发现数据的错误,从而放弃错误数据的使用。

    对于嵌入式一些比较简单的领域,对成本也比较关注,这种要基于成本的考虑注定所选用的单片机的性能都比较弱,所以
    所使用的的检验算法都比较简单,诸如 UART 使用的奇偶校验。

    今天的主角,累加和校验算法,又名 CheckSum 算法。实现起来同样比较简单,但是比较有效,尤其对于一些性能一般的硬件。

    至于算法出处,没找到是哪位大佬首先发明的,只能抱以深深地敬意,这里就不细细考究了。

    二、原理与实现

    这种算法的实现非常,主要是发送方之间的配合:

    • 发送方:对所有的数据累加,得到一个数据和,对和求反,即得到我们的校验值。然后把要发的数据和这个校验值一起发送给接收方。

    • 接收方:对接收的数据(包括校验和)进行累加,然后加1,如果得到0,那么说明数据没有出现传输错误。(注意,此处发送方和接收方用于保存累加结果的类型一定要一致,否则加1就无法实现溢出从而无法得到0,校验就会无效)

    还是举个例子:

    • 发送方:要发送 0xA80x50,我们使用 unsigned char(8位)类型的变量来保存累加和,即为 0xF80b11111000),取反得到校验和为 0x070b00000111)。然后将这三个数据发送出去。

    • 接收方:如果接收正确,这三个数据的累加和就是(0b11111111),此时加 1 ,则得到的结果为 0(实际得到的应该是0b100000000,但是由于是使用 unsigned char(8位)来保存累加和,所以高位溢出被截取掉,只剩下了低八位的 80 )。

    由上面的例子,我们可以知道算法的目的是:使累加和和校验值相加得到一个二进制下每一位都是 1 的结果,这个结果很明显很好处理,这种算法实现起来也很简单,下面给出 C 语言的代码示例。

    发送方:以下是如何得到校验值的代码,结果就是我们想要的校验值。

    uint8_t TX_CheckSum(uint8_t *buf, uint8_t len) //buf为数组,len为数组长度
    { 
        uint8_t index = 0;
        uint8_t ret = 0;
    
        for (index = 0; index  < len; index++)
        {
            ret += *(buf++);
        }
    	ret = ~ret;
    	
        return ret;
    }
    

    接收方:输入已包含发送发发来的校验值,如果函数返回的值如果是0,说明数据正确。

    uint8_t RX_CheckSum(uint8_t *buf, uint8_t len) //buf为数组,len为数组长度
    { 
        uint8_t index = 0;
        uint8_t ret = 0;
    
        for (index = 0; index < len; index++)
        {
            ret += *(buf++);
        }
    	ret = ret;
    	
        return ret + 1;
    }
    

    更多精彩内容,更多惊喜,请关注公众号《嵌入式小散修》
    在这里插入图片描述

    展开全文
  • 电梯梯控系统简单判断,时间校验算法工具,限于梯控编码技术研究。
  • 为了防止这些错误所带来的影响,一般在通信时采取数据校验方法,而奇偶校验和循环冗余码校验就是其中最常用校验算法。串行数据在传输过程中,由于干扰可能引起信息的错误,出现“误码”。我们把如何发现传输中的...

    本篇博客主要记载了我对数据校验过程以及奇偶校验的理解。

    1.数据校验过程

    由于数据传输距离的因素影响,计算机和受控设备间的通信数据就常常出现不可预知的错误。为了防止这些错误所带来的影响,一般在通信时采取数据校验方法,而奇偶校验和循环冗余码校验就是其中最常用的校验算法。串行数据在传输过程中,由于干扰可能引起信息的错误,出现“误码”。我们把如何发现传输中的错误,叫“检码”;发现错误后,如何进行修订,叫“检错”。
    之前,就有过提示,为了保证数据在传输过程中不会出错,每个数据包后面一般都会加上校验字节。


    校验过程是发送端(TX端)和接收端(RX端)共同完成的过程。如上图所示,首先,TX端按照用户层协议(数据包格式)将数据根据校验算法计算出TX校验字节,并将TX校验字节按照协议放在数据包的指定位置。RX端接收到数据包后,在指定位置取出TX校验字节,同时,再将接收到的数据按规定方式计算出RX校验字节,如果RX校验字节与接收到的TX校验字节相等,则说明数据包是有效的,否则就应该放弃该数据包。

    2.简单粗暴地奇偶校验

    最简单粗暴的方法就是“奇偶校验”了,即在传输字符的各位之外,再传送一位奇/偶校验位。可采用的策略分为奇校验和偶校验。

    2.1 奇校验

    所有传送的位数(含字符的个数位和校验位)中,“1”的个数为奇数,如1 0110,0101;0 0110,0001

    2.2 偶校验

    所有传送的位数(含字符的各位数和检验位)中,“1”的个数为偶数,如1 0100,0101;0 0100,0001
    奇偶校验能够检测出信息传输过程中的部分错误的数据(一位错误的代码能够检出,两位及以上的错误代码不能检出)。奇偶检验有一个劣势,就是他只能发现错误,而不能纠正错误;一旦发现错误,那么没办法,只能重发。但是由于奇偶校验使用起来非常简单,仍然被广泛使用。但是仍存在一些良好的矫正错误数据的方法,并具有自动訆错能力,如循环冗余码(CRC)检错等。

    3.异或校验

    异或校验方法也是非常简单,而且非常通用,虽然使用该方法校验后仍存在出错的可能,但是因为异或算法非常简单,编程毫不费力,一般新手都用这种方法。
    之前介绍过的NMEA-0183无线通信协议是在异或算法基础之上进行了一定的改进。能够理解异或运算,并使用好异或校验算法,会使得数据处理编程变得轻松容易。

    4.CRC循环冗余码校验

    循环冗余码校验(Cyclical Redundancy Check, CRC)是利用除法和余数的原理来做错误侦测(Error Detecting)的。实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置RX,RX对收到的数据重新计算CR并与收到的CRC值相比较,若两个CRC值不同,则说明数据通信出现了错误,该数据包应该舍弃不用。
    在远距离数据通讯中,为确保高效而无差错的传送数据,必须对数据进行校验控制,而CRC是对一个传送数据块进行校验,是一种非常高效的差错控制方法。目前,主流的CRC可以分为以下几个标准:CRC-12码;CRC-16码;CRC-CCITT码;CRC-32码。
    CRC-12码通常用来传送6-bit字符串。CRC-16及CRC-CCITT码则用来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。CRC-32码用途有限。
    在数据存储和数据通信领域,CRC无处不在:著名的通信协议X.25的FCS(帧检错序列)采用的是CRC/CCITT,ARJ/LHA等压缩工具软件采用的是CRC32,磁盘驱动器读写采用的日式CRC16,通常用到的图像存储格式GIF/TIFF等也是采用CRC作为检错手段的。

    4.1 CRC-16的生成过程

    CRC-16码由两个字节构成,在开始时CRC寄存器的每一位都预置为1,然后把CRC寄存器与8-bit的数据进行异或,之后对CRC寄存器从高位向低位进行移位,在最高位(MSB)的位置补零,而最低位(LSB,移位后已经被移除CRC寄存器)如果是1,则把寄存器与预定义的多项式码进行异或,否则如果LSB为零,就无需进行进行异或。重复上述的由高至低的移位8次,第一个8-bit数据处理完毕,用此时CRC寄存器的值与下一个8-bit数据异或并进行如前一个8-bit数据似的8次移位。所有的字符处理完成后CRC寄存器的值即为最终的CRC值。
    下面为CRC的计算过程:
    (1)设置CRC寄存器,并给其赋值FFFF(hex);
    (2)将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器;
    (3)CRC寄存器向右移一位,MSB补零,移出并检查LSB;
    (4)如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或;
    (5)重复第3与第4步直到8次移位全部完成。此时,一个8-bit数据处理完毕;
    (6)重复第2至第5步直到所有数据全部处理完成;
    (7)最终CRC寄存器的内容即为CRC值。

    4.2 如何理解CRC码?

    CRC校验是一种多项式除法:将需要发送的数据包当做一个很大的二进制数,用它来除以一个固定的二进制数,所得到的余数即是所求得的CRC校验码。
    展开全文
  • 关注、星标公众号,直达精彩内容来源:网络素材UART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有...技术让梦想更伟大1校验校验和是最基本,也是嵌入式软件工程师最常用的一种校验算法...
  • 算法大全常用数值算法MATLAB数学建模算法灰色算法蒙特卡洛神经网络图论算法遗传算法资料大集合: 图论算法 常用数值算法--C语言 数学建模算法全收录 模拟退火 灰色算法 神经网络 蒙特卡洛 蚁群算法 遗传算法 二分法....
  • 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法或散列...
  • 在实现业务需求过程中,通常要用到相关一些校验算法,简单整理常用校验算法并做笔记: 常用校验算法简单说明: 1:校验和:按每个字节,计算累加和, 2:异或校验:定义初值,按每个字节异或,求结果。 3:CRC校验:...
  • 常见校验算法

    千次阅读 2016-07-12 16:19:34
    常见的校验算法有checksum、奇偶校验、海明码校验、循环冗余校验、MD系列、SHA系列等。。
  • 14、C# 数据通信中常用的24种数据校验算法.zip,WindowsFormsApp,.vs,WindowsFormsApp,v16,.suo,WindowsFormsApp.sln,WindowsFormsApp,crcs.cs,Form1.cs,bin,Debug,WindowsFormsApp.exe,WindowsFormsApp.exe.config,...
  • CRC 校验算法代码

    2018-12-21 14:26:09
    CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,...
  • 常见的校验算法

    2022-06-01 15:52:29
    算法
  • C# 异或校验算法

    千次阅读 2021-05-20 06:42:18
    C# 的异或校验算法 直接上代码public partial class FormCRC : Form{public FormCRC(){InitializeComponent();}private void FormCRC_Load(object sender, EventArgs e){}/// /// CRC异或校验/// /// 命令字符串/// ...
  • 常用国密算法介绍

    千次阅读 热门讨论 2021-07-23 10:02:23
    在终端设备上通常需要使用内嵌国密算法的安全芯片配合使用,倚靠安全芯片的安全性来实现密钥的存储和安全防护。 密码算法是保障信息安全的核心技术,在一些重要的行业例如:银行业、游戏业、互联网业以前长期以来...
  • 常用crc校验算法原理

    2011-04-11 21:05:22
    一分关于CRC原理的文档,介绍了1位8位4位的算法原理。
  • 串口通讯CRC计算校验工具,便于工程调试,本工具用来计算CRC校验,可以计算接收到的校验码是否正确。在最下面输入字节,直接计算。
  • 几种常见的校验算法

    千次阅读 2020-06-13 20:52:54
    关注、星标公众号,不错过精彩内容素材来源:网络编辑整理:strongerHuangUART有一个奇偶校验,CAN通信有CRC校验。Modbus、MAVlink、USB等通信协议也有校验信...
  • 常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法。 对称加密 指加密和解密使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。假设两个用户需要使用...
  •   循环冗余校验(Cyclic Redundancy Check,CRC)是数据通讯中很常用的一种校验方式。尤其是在嵌入式软件开发中,经常要用到 CRC 算法对各种数据进行校验。生成的数字在传输或者储存之前计算出来并且附加到数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,945
精华内容 31,978
关键字:

常用校验算法