校验算法专辑

由于最近一直在接触公司的通讯协议,包括基于HTTP协议、SOCKET、串口通讯协议封装的PUSH、PULL通信协议SDK。

通讯协议无可避免的需要校验,想想以前在B公司自己定制的通讯协议连校验的算法都木有,简直low到不行,如此,问题来了,

主流的通讯协议校验算法都有哪些? 于是这篇文章就应运而生了:

首先,比较常用的算法有:

一、奇偶校验:

1. 定义

根据被传输的一组二进制代码中“1”的个数是奇数或偶数来进行校验。

使用:通常专门设置一个奇偶校验位,存放代码中“1”的个数为奇数还是偶数。若用奇校验,则奇偶校验位为奇数,表示数据正确。若用偶校验,则奇偶校验位为偶数,表示数据正确。

2. 应用

eg.  数据位为 10001100 (1)  -> 最后一位为校验位

此时若约定好为奇校验,那么数据表示为正确的,若为偶校验,那么数据传输出错了。

二、CRC校验:

1. 定义

CRC校验是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

2. 计算过程:

a> 设置CRC寄存器,并给其赋值FFFF(hex)。

b> 将数据的第一个8-bit字符与16位CRC寄存器的低8位进行异或,并把结果存入CRC寄存器。

c> CRC寄存器向右移一位,MSB补零,移出并检查LSB。

d> 如果LSB为0,重复第三步;若LSB为1,CRC寄存器与多项式码相异或。

e> 重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。

f> 重复第2至第5步直到所有数据全部处理完成。

g> 最终CRC寄存器的内容即为CRC值。

常用的CRC循环冗余校验标准多项式如下:   CRC(16位) = X16+X15+X2+1   CRC(CCITT) = X16+X12 +X5+1

CRC(32位) = X32+X26+X23+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+1

以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。

3. 应用:在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。

三、LRC校验:

1. 定义:LRC校验用于ModBus协定的ASCII模式,这各校验比较简单,通讯速率较慢,它在ASCII协议中使用,检测了消息域中除开始的冒号及结束的回车换行号外的内容。它仅仅是把每一个需要传输的数据字节迭加后取反加1即可。

2. 应用

eg. 5个字节:01H+03H+21H+02H+00H+02H = 29H,然后取2的补码=D7H。

四、异或校验:

1. 定义

BCC校验其实是奇偶校验的一种,但也是经常使用并且效率较高的一种。所谓BCC校验法,就是在发送前和发送后分别把BCC以前包括ETX字符的所有字符按位异或后,按要求变换(增加或去除一个固定的值)后所得到的字符进行比较。相等即认为通信无错误,不相等则认为通信出错。

五、格雷码校验:

1. 定义

格雷码是一种无权码,也是一种循环码。是指任意两组相邻的代码之间只有一位不同,其余为都相同。

如:5的二进制为0101    6的二进制为0110

5的格雷码为0111    6的二进制为0101

六、MD5校验

1. 定义

MD5的实际应用是对一段Message(字节串)产生fingerprint(指纹),可以防止被篡改。

七、校验和

1. 定义

校验一组数据项的和是否正确。通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255。

2. 应用

eg. 数据01020304的校验和为a。

时间: 2024-10-07 02:48:34

校验算法专辑的相关文章

校验算法之二进制反码求和

IP/ICMP/IGMP/TCP/UDP等协议的校验和算法都是相同的,算法如下: 在发送数据时,为了计算数IP据报的校验和.应该按如下步骤:    (1)把IP数据报的首部都置为0,包括校验和字段.    (2)把首部看成以16位为单位的数字组成,依次进行二进制反码求和.    (3)把得到的结果存入校验和字段中.    在接收数据时,计算数据报的校验和相对简单,按如下步骤:    (1)把首部看成以16位为单位的数字组成,依次进行二进制反码求和,包括校验和字段.    (2)检查计算出的校验和

GSM07.10协议中串口复用使用的校验算法

1 const static unsigned char __crctable[256] = 2 { 3 0x00, 0x91, 0xE3, 0x72, 0x07, 0x96, 0xE4, 0x75, 4 0x0E, 0x9F, 0xED, 0x7C, 0x09, 0x98, 0xEA, 0x7B, 5 0x1C, 0x8D, 0xFF, 0x6E, 0x1B, 0x8A, 0xF8, 0x69, 6 0x12, 0x83, 0xF1, 0x60, 0x15, 0x84, 0xF6, 0x67,

Redis rdb文件CRC64校验算法 Java实现

查看RDB文件结构,发现最后的8字节是CRC64校验算得,从文件头开始直到8字节校验码前的FF结束码(含),经过CRC64校验计算发现,貌似最后的8字节是小端模式实现的. 参考redis的crc64实现的代码,点击查看 Java代码如下: 1 package com.jadic.utils; 2 3 /** 4 * @author Jadic 5 * @created 2014-5-15 6 */ 7 public class CRC64 { 8 private static final lon

传输数据校验算法研究

 今天简单介绍一些传输数据校验的方法,就昨天整理的资料和就我的理解写的Demo做个总结!希望大家多多指教! 定义 通俗的说,就是为保证数据的完整性,用一种指定的算法对原始数据计算出的一个校验值.接收方用同样的算法计算一次校验值,如果和随数据提供的校验值一样,说明数据是完整的. 实际应用 防止自己的程序被篡改. 有些可执行程序,当被改了资源时再运行会有文件已损坏的提示,这就是使用了数据校验.本例是用md5做为数据校验的算法.当然你可以使用个性化的 比如des作为数字签名,那样安全性更高. 校验方法

C语言中的校验算法

数据通信的校验算法核心思想:为了保证通讯数据的可靠性,通常加入校验来验证一帧数据是否有误,校验的方式有很多种,异或校验是常见的一种,你这个如2楼说的,是逐字节进行按位异或运算,结果放在最后一个字节,接收方收到数据进行同样计算,如果最后一个字节和计算结果一致,则可认为这一帧数据可信.

某公司员工卡金额校验算法破解

漏洞概要关注数(35) 关注此漏洞 缺陷编号: WooYun-2011-03701 漏洞标题: 某公司员工卡金额校验算法破解 相关厂商: 某奇怪公司 漏洞作者: insight-labs 提交时间: 2011-12-21 21:55 公开时间: 2012-02-04 21:55 漏洞类型: 成功的入侵事件 危害等级: 高 自评Rank: 20 漏洞状态: 厂商已经确认 漏洞来源: http://www.wooyun.org Tags标签: 盲目信任用户数据 加密算法设计错误 RFID安全 硬件安

关于校验算法的学习(学习以太网时遇到的)

关于校验算法的学习(学习以太网时遇到的)以太网的包头还是数据都会有校验,在FPGA上实现IP核时,用的是CRC校验,然后学习ICMP协议时,也看到一种校验算法,以此学习分析一下背后原理. 一.先看看ICMP的包格式,主要是写ping命令是用到(会有一篇专门将ping的c语言实现),所以只是展示与ping命令背后的ICMP规则. (来自维基) 对于校验的研究暂时不需要理解其他数据的意思,维基对checksum的解释为 Checksum Error checking data, calculated

校验算法

# 校验算法 ### 常见的校验算法------------------------------ LRC- BCC- CRC ### LRC------------------------------ 简介 - 纵向冗余校验(Longitudinal Redundancy Check,简称:LRC)是通信中常用的一种校验形式,也称LRC校验或纵向校验.它是一种从纵向通道上的特定比特串产生校验比特的错误检测方法.在行列格式中(如磁带),LRC经常是与VRC一起使用,这样就会为每个字符校验码.在工业

C# 异或校验算法

C# 的异或校验算法 直接上代码 public partial class FormCRC : Form { public FormCRC() { InitializeComponent(); } private void FormCRC_Load(object sender, EventArgs e) { } /// <summary> /// CRC异或校验 /// </summary> /// <param name="cmdString">命