一个CRC-8编码类,多项式为x8+x2+x+1
public class CRC8
{
/// <summary>
/// 获得CRC校验码
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static byte GetCRC(byte[] data)
{
return GetCRC(data, data.Length);
}
public static byte GetCRC(byte[] data, int leng)
{
byte[] buf = new byte[leng + 1];
data.CopyTo(buf, 0);
buf[buf.Length - 1] = 0;
byte key = 0x83; //根据多项式为x8+x2+x+1 的简码100000111去掉最低位获得
byte crc1, crc2;
int ptr = 0;
int i;
int count = leng;
crc1 = buf[ptr++];
while (--count >= 0)
{
crc2 = buf[ptr++];
for (i = 0; i < 8; i++)
{
if (((crc1 & 0x80) >> 7) == 1)//最高位为1
{
crc1 = (byte)(crc1 ^ key);//异或运算
crc1 = (byte)(crc1 << 1); //移出高位
if (((crc2 & 0x80) >> 7) == 0)//判断crc2高位是否为0
{
crc1 = (byte)(crc1 | 0x01); //crc1低位由0变1
}
crc2 = (byte)(crc2 << 1); //移出高位
}
else
{
crc1 = (byte)(crc1 << 1); //移出高位
if (((crc2 & 0x80) >> 7) == 1)//判断crc2高位是否为0
{
crc1 = (byte)(crc1 | 0x01); //crc1低位由0变1
}
crc2 = (byte)(crc2 << 1); //移出高位
}
}
}
return crc1;
}
}

浙公网安备 33010602011771号