using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace UDSServices
{
public class Crc32Helper
{
public static uint GetCRC32(byte[] buffer, bool reverseDataBytes, bool reverseResultBeforeFinalXor, uint truncatedPolynomial = 0x04C11DB7, uint crc = 0xFFFFFFFF, uint finalXorValue = 0xFFFFFFFF)
{
int length = buffer.Length;
byte data;
//uint crc = 0xFFFFFFFF; //初始值(16位举个例子0xFFFF,8位0xFF)
int i;
for (int j = 0; j < length; j++)
{
data = buffer[j];
if (reverseDataBytes)
{
data = (byte)Reverse8(data); //输入是否反转,如果不需要则这句注释掉;
}
crc = (uint)(crc ^ (data << 24)); //32位左移24位,16位左移8位,8位左移0位;
for (i = 0; i < 8; i++)
{
if ((crc & 0x80000000) == 0x80000000)//16位 0x8000 8位 0x80
{
crc = (crc << 1) ^ truncatedPolynomial;//多项式,没什么好说的;
}
else
{
crc <<= 1;
}
}
}
if (reverseResultBeforeFinalXor)
{
crc = Reverse32(crc);//输出是否需要反转,注意如果是16位则调用Reverse16(crc),8位调用Reverse8(crc)
}
crc = crc ^ finalXorValue;// xor 异或值(与上面初始值类似,16位 0x0000 8位 0x00;
return crc;
}
private static uint Reverse32(uint data)
{
byte i;
uint temp = 0;
for (i = 0; i < 32; i++)
{
temp |= ((data >> i) & 0x01) << (31 - i);
}
return temp;
}
private static uint Reverse16(uint data)
{
byte i;
uint temp = 0;
for (i = 0; i < 16; i++)
{
temp |= ((data >> i) & 0x01) << (15 - i);
}
return temp;
}
private static byte Reverse8(byte data)
{
byte i;
byte temp = 0;
for (i = 0; i < 8; i++)
{
temp = (byte)(temp | (((data >> i) & 0x01) << (7 - i)));
}
return temp;
}
}
}