CRC 循环冗余效验
CRC循环冗余效验 利用多项式 x6 + x4 + x3,实际为使用模2除法来做的加密
常用crc多项式有
|
名称 |
生成多项式 |
数值式 |
简记式 |
标准引用 |
|
CRC-4 |
x4+x+1 |
0x1’3 |
0x3 |
ITU G.704 |
|
CRC-8 |
x8+x5+x4+1 |
0x1’31 |
0x31 |
|
|
CRC-8 |
x8+x2+x1+1 |
0x1’07 |
0x07 |
|
|
CRC-8 |
x8+x6+x4+x3+x2+x1 |
0x1’5E |
0x5E |
|
|
CRC-12 |
x12+x11+x3+x2+x+1 |
0x1’80F |
0x80F |
|
|
CRC-32c |
注** |
0X1’1EDC6F41 |
0x1EDC6F41 |
SCTP |
多项式即要验证数据的除数
过程
a.生成 循环效验的余数 例如;要发送的数据a 对 指定除数模2取余数b(例如crc32的除数0x1EDC6F41),
b.发送数据为a+b,长度len(a)+len(b)
然后发送给目标:
接收之后:
1.对收到的数据 用指定除数(如过程a)进行模2取余数b,
2.如果余数为0,则效验成功,否则失败
区中模2除法取余核心为代码:思路使用deque,然后pushback,分别异或算法
代码如下:
// CRC.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream>
#include <vector>
#include <math.h>
#include <cmath>
#include <deque>
using namespace std; //二进制的位数
int GetBitNum(int n)
{
int i = 0;
while (n > 0)
{
n = n >> 1;
i++;
}
return i;
}
bool GetBitAt(int n, int pos)
{
int m = 1 << pos;
int nRes = n & m;
return (n & m) > 0;
}
int Left(int n, int count)
{
int num = GetBitNum(n);
return n >> (num - count);
}
int Right(int n, int count)
{
int n1 = n >> count;
n1 = n1 << count;
return n ^ n1;
} int Mod(int m, int n)
{
std::deque<int> dqM;
std::deque<int> dqN; int nlen = GetBitNum(n);
int mlen = GetBitNum(m);
for (int i = 0; i < nlen; i++)
{
int nb = GetBitAt(n, i) ? 1 : 0;
cout << nb;
dqN.push_front(nb);
}
cout << endl;
for (int i = 0; i < mlen; i++)
{
//
int nb = GetBitAt(m, i) ? 1 : 0;
dqM.push_front(nb);
cout << nb;
}
cout << endl; while (dqM.size() > dqN.size())
{
//这里做运算
for (int i = 0; i < dqN.size(); i++)
{
dqM[i] = dqM[i] ^ dqN[i];
}
while (dqM.size() > 0 && dqM.front() == 0)
{
dqM.pop_front();
}
}
int t = 0;
for (int i = 0; i < dqM.size(); i++)
{
t += 2 << (dqM.size() - i - 1);
}
return t;
}
void printbool(bool bPrint)
{
if (bPrint)
cout << 1;
else
cout << 0;
} int main()
{
/*int n = 1 ^ 1;
cout << n << endl;
n = 1 ^ 0;
cout << n << endl;
n = 0 ^ 1;
cout << n << endl;
n = 0 ^ 0;
cout << n << endl;*/ //m为要发送的数据
//n为多项式 1001:= x4+1:
//余数为要发送的数
//效验过程, 发送的数据除以多项式 余数为0即校验成功 int m = 12344556;
int n = 9;
int mod = Mod(m, n);
//发送的数字为m+n
int mlen = GetBitNum(m);
//长度
int nReal = mlen + GetBitNum(mod); int nRealSend = m << GetBitNum(mod) + m;
int nn = Mod(nRealSend, n);
cout << nn << endl; return 0;
}
CRC 循环冗余效验的更多相关文章
- Redis源代码分析(23)--- CRC循环冗余算法RAND随机数的算法
他今天就开始学习Redis源代码的一些工具来实现,在任何一种语言工具.算法实现的原理应该是相同的,一些比較经典的算法.比方说我今天看的Crc循环冗余校验算法和rand随机数产生算法. CRC算法全称循 ...
- CRC循环冗余检测C语言实现----花了几天时间乱写的
由于笔者目前正在上计算机网络的课,老师要我们编一下crc的循环检测过程,所以我想着刚好在学c,那就随便看看写不写的了,首先百度了一下网上资料,基本都是用位移运算符实现的,由于本人懒得去看一下位移运算, ...
- crc循环冗余校验
循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误.它 ...
- LRC CRC 纵向冗余码校验
LRC CRC 纵向冗余码校验 2010-01-26 11:00:15| 分类: 电气 | 标签: |字号大中小 订阅 1.LRC校验 LRC域是一个包含一个8位二进制值的字节.LRC值由 ...
- crc循环冗余检验
CRC(Cyclic Redundancy Check):循环冗余检验.在链路层被广泛使用的检错技术. CRC原理: 1.发送端 1.1.在发送端先将数据分组,每组k个数据.假定要传送的数据是M. 1 ...
- CRC碰撞
循环冗余效验(Cyclic Redundancy Check, CRC) 是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误. ...
- [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码
1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检 ...
- PNG图片数据解析
PNG是一种非常流行的图片格式,它不仅支持透明效果,而且图片数据经过了压缩处理,所以广泛用于web等应用. PNG的文件格式: PNG文件中的数据,总是以一个固定的8个字节开头: (图片来自http: ...
- 关于图片的PNG与JPG、JIF格式
一:GIF(Graphics Interchange Format) 简介 GIF图形交换格式是一种位图图形文件格式,以8位色(即256种颜色)重现真彩色的图像. 它实际上是一种压缩文档,采用LZW压 ...
- 前端进阶试题css(来自js高级前端开发---豪情)既然被发现了HOHO,那我就置顶了嘿嘿!觉得自己技术OK的可以把这套题目做完哦,然后加入高级前端的社区咯
http://www.cnblogs.com/jikey/p/4426105.html js高级前端开发加群方法(此群很难进,里面纯技术,严禁广告,水群) 完整题目做完发邮箱(jikeytang@16 ...
随机推荐
- 一篇文章让你读懂Java异常栈信息
一. 基本的异常打印 public class Test { public static void main(String[] args) { fun1();//第4行 } public static ...
- Redis内存容量评估
业务侧申请redis服务器资源时,需要事先对redis容量做一个大致评估,之前的容量评估公式基本只是简单的 (key长度 value长度)* key个数,误差较大,后期经常需要进行缩扩容调整,因此提出 ...
- MLP实现波士顿房屋价格回归任务
1. 数据集 波士顿房屋价格.csv文件,文件中的数据有可能不完整,部分数据如下: CRIM, ZN ,INDUS ,CHAS,NOX,RM,AGE,DIS,RAD,TAX,PTRATIO,LSTAT ...
- .net c# 文件分片/断点续传之下载--客户端
断点续传客户端实现主要参考了以下文章: https://blog.csdn.net/binyao02123202/article/details/76599949 客户端实现续传的主要是一下几点 1. ...
- 使用Docker快速安装Redis
1.使用docker命令下一个redis的镜像 docker pull redis 2.创建 redis 的 data 目录和 conf 目录 1. cd /home/fengsir/redis 2. ...
- Google,Baidu,Bing三大搜素引擎图片爬虫
Google,Baidu,Bing三大搜素引擎图片爬虫 参考https://mp.weixin.qq.com/s/75QDjRTDCKzuM68L4fg5Lg 这个爬虫由ID为sczhengyabin ...
- [SHOI2011]双倍回文 题解
[SHOI2011]双倍回文 题解 看了一些写回文自动机的大佬的代码,我深感敬畏,于是我转身向Manacher走去 现在荣登最优解第一页-- 说实话,这个方法的复杂度是很玄学的,但是加了一些优化之后, ...
- Java实现延迟执行代码
Java实现延迟执行代码对于Java程序在它们的操作中添加延迟或暂停是比较常见的.这对于任务暂停直到另外任务完成执行场景比较有用.本文我们提供两类方法实现延迟执行. 1. 基于线程(Thread)方法 ...
- es语法 rest api 模拟根据歌手,歌名,歌词来搜索demo
#创建索引songs_v1 PUT { - "acknowledged": true, "shards_acknowledged": true, "i ...
- Oracle 数据库 命令行安装
Oracle 数据库 命令行安装 1. 准备工作 关闭 防火墙,关闭 SElinux 2. 安装相关依赖包 yum -y install binutils compat-libcap1 compat- ...