crc源碼
① 求crc32校驗C#源碼,能用的哦!跪謝
我有CRC16校驗的C#代碼:
CRC循環冗餘錯誤校驗計算方法&&代碼
CRC—16(循環冗餘錯誤校驗)生成CRC—16校驗位元組的步驟如下:
(1)裝入一個16位寄存器,所有數位均為1。
(2)該16位寄存器的高位位元組與開始8位位元組進行「異或」運算。運算結果放入這個16位寄存器。
(3)把這個16位寄存器向右移1位。
(4a)若向右(標記位)移出的數位是1,則生成多項式1010000000000001和這個寄存器進行「異或」運算。
(4b)若向右移出的數位是0,則返回(3)。
(5)重復(3)和(4),直至移出8位。
(6)另外8位與該16位寄存器進行「異或」運算。
(7)重復(3)—(6),直至該報文所有位元組均與16位寄存器進行「異或」運算,並移位8次。
(8)這個16位寄存器的內容即2位元組CRC錯誤校驗
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace CommPort
{
public class CRC16
{
public CRC16()
{
}
//校驗crc16
public static bool check(byte[] buff, int index, int len)
{ //buff是待校驗數組,index為起始索引,len為校驗長度
//buff是待校驗數組,index為起始索引,len為校驗長度
uint i, j;
byte h, l;
byte c, d;
h = 0x55;
l = 0xaa;
for (i = (uint)index; i < index + len; i++)
{
h = (byte)(buff[i] ^ h);
for (j = 0; j < 8; j++)
{
c = (byte)(l & 0x80);
l <<= 1;
d = (byte)(h & 0x80);
h <<= 1;
if (c != 0)
h |= 0x01;
if (d != 0)
{
//
h = (byte)(h ^ 0x10);
l = (byte)(l ^ 0x21);
}
}
}
if ((h == 0) && (l == 0))
return true;
else
return false;
}
//計算一個byte數組中指定位置的crc16
public static byte[] cal(byte[] buff, int index, int len)
{
//buff是待校驗數組,index為起始索引,len為校驗長度
uint i, j;
byte h, l;
byte c, d;
h = 0x55;
l = 0xaa;
for (i = (uint)index; i < index + len; i++)
{
h = (byte)(buff[i] ^ h);
for (j = 0; j < 8; j++)
{
c = (byte)(l & 0x80);
l <<= 1;
d = (byte)(h & 0x80);
h <<= 1;
if (c != 0)
h |= 0x01;
if (d != 0)
{
//
h = (byte)(h ^ 0x10);
l = (byte)(l ^ 0x21);
}
}
}
byte[] resu = new byte[2];
resu[0] = (byte)h;
resu[1] = (byte)l;
return resu;
}
}
}
② 求一個CRC校驗C++源代碼。題目:發送數據為1101011011,生成的多項式為P(X)=X4+X+1(X4為X的4次方),
下面的代碼輸入為原數據和多項式對就的二進制碼,輸出為產生的校驗碼。
如原數據是1101011011,多項式是X^4+X+1(即10011)。產生的校驗碼為1110。
輸入110101101110011
輸出1110
#include<iostream>
#include<cstring>
#include<iomanip>
usingnamespacestd;
#defineWORDSIZE255
intgetNum(chara[],intn);
voidshowNum(intr,intn);
intmain(intargc,char*argv[])
{
cout<<"pleaseinputXandP:"<<endl;
intx,p,lenA,lenP;
chara[WORDSIZE];
memset(a,'