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 ...
随机推荐
- jQuery——链式操作
链式操作,即连续操作. 例如: <!DOCTYPE html> <html> <head> <script src="https://cdn.boo ...
- 一个简单demo展示应用接口使用goroutine优雅退出
package main import ( "context" "errors" "log" "net/http" &q ...
- Servlet中/和/*的区别详解
Servlet中/和/*的区别详解 问题 在搭建springmvc项目时,DispatcherServlet配置为/*时welcome-file-list失效了报404异常, 配置为/时可以正常访问, ...
- uniapp 拨打电话功能
phoneNumber进行动态调用时候一定要添加引号,否则会报错 1 call() { 2 uni.makePhoneCall({ 3 phoneNumber: 'this.leads.tel' // ...
- numpy基础--random模块:随机数生成
以下代码的前提:import numpy as np numpy.random模块对python内置的random进行了补充,增加了一些高效生成多种概率分布的样本值的函数.例如可以用normal来得到 ...
- Java synchronized与ReentrantLock的区别
synchronized与ReentrantLock的区别 synchronized是一个关键字,ReentrantLock是一个类 synchronized修饰代码块和方法,ReentrantLoc ...
- Java中对的创建与引用
对象与引用 Java语言中除了基本数据类型以外都属于引用类型 Java中的对象是通过引用对其操作的 class Car{ String name; String color; int price; } ...
- Java第二次Blog
7-4~6题目集 前言 这些题目主要用到对象与类的处理继承与多态的使用: 继承和多态是面向对象编程中相互关联的两个概念.继承为多态提供了基础,而多态则通过继承实现了代码的灵活性和可扩展性. 1.字符串 ...
- VMware搭建集群环境
集群地址分配 名称 IP 子网掩码 网关 DNS flink01 192.168.22.211 255.255.255.0 192.168.22.2 114.114.114.114 flink02 1 ...
- 喜讯!INFINI Easysearch 在墨天轮数据库排名中挺进前30!
近日,2023 年 10 月的 墨天轮中国数据库流行度排行 火热出炉,本月共有 283 个数据库参与排名,中国数据库行业竞争日益激烈.其中,极限科技旗下软件产品 INFINI Easysearch 稳 ...