CRC32 是一种校验和算法,用于检测消息是否未被修改。
 它被广泛使用:例如,计算以太网发送包校验和。
public class CRC32
{
	private static readonly uint[] Crc32Table = new uint[256];
	static CRC32()
	{
		uint i, j;
		uint crc;
		for (i = 0; i < 256; i++)
		{
			crc = i;
			for (j = 0; j < 8; j++)
			{
				if ((crc & 1) > 0)
					crc = (crc >> 1) ^ 0xEDB88320;
				else
					crc >>= 1;
			}
			Crc32Table[i] = crc;
		}
	}
	public static byte[] Compute(byte[] data)
	{
		return Compute(data, 0, data.Length);
	}
	public static byte[] Compute(byte[] data, int offset, int count)
	{
		uint crc = ComputeUint(data, offset, count);
		return [
			(byte)((crc >> 24) & 0xff),
			(byte)((crc >> 16) & 0xff),
			(byte)((crc >> 8) & 0xff),
			(byte)(crc & 0xff),
		];
	}
	public static uint ComputeUint(byte[] data)
	{
		return ComputeUint(data, 0, data.Length);
	}
	public static uint ComputeUint(byte[] data, int offset, int count)
	{
		uint crc = 0xffffffff;
		for (var i = offset; i < offset + count; i++)
		{
			crc = (crc >> 8) ^ Crc32Table[(crc ^ data[i]) & 0xff];
		}
		return crc ^ 0xffffffff;
	}
}
















![[STM32] 简单介绍 (一)](https://i-blog.csdnimg.cn/direct/60abdf49da5745b381c39d3f6b54d4ee.png)



