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; }