在项目的开发过程中,需要用的CRC-8/MAXIM来进行验证,网上找了很多资料,基本的都是CRC-8的资料,CRC-8/MAXIM的可以说基本上没有,有的也是用C和JAVA写的,最后我用JAVA写的翻了一版过来,自己测试了一下,没有问题,代码如下:
/// <summary>
/// CRC8帮助类
/// </summary>
public static class CRC8Helper
{
/// <summary>
/// CRC-8 x8+x2+x+1
/// </summary>
/// <param name="source">16进制转的数组</param>
/// <param name="length">数组长度</param>
/// <param name="offset">偏移值</param>
/// <returns></returns>
public static int CRC8(byte[] source, int length, int offset = 0)
{
int wCRCin = 0x00;
int wCPoly = 0x07;
for (int i = offset, cnt = offset + length; i < cnt; i++)
{
for (int j = 0; j < 8; j++)
{
bool bit = ((source[i] >> (7 - j) & 1) == 1);
bool c07 = ((wCRCin >> 7 & 1) == 1);
wCRCin <<= 1;
if (c07 ^ bit)
wCRCin ^= wCPoly;
}
}
wCRCin &= 0xFF;
return wCRCin ^= 0x00;
}
/// <summary>
/// CRC8-DARC
/// </summary>
/// <param name="source">16进制转的数组</param>
/// <param name="length">数组长度</param>
/// <param name="offset">偏移值</param>
/// <returns></returns>
public static int CRC8_DARC(byte[] source, int length, int offset = 0)
{
int wCRCin = 0x00;
// Integer.reverse(0x39) >>> 24
int wCPoly = 0x9C;
for (int i = offset, cnt = offset + length; i < cnt; i++)
{
wCRCin ^= source[i] & 0xFF;
for (int j = 0; j < 8; j++)
{
if ((wCRCin & 0x01) != 0)
{
wCRCin >>= 1;
wCRCin ^= wCPoly;
}
else
{
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0x00;
}
/// <summary>
/// CRC8-ITU x8+x2+x+1
/// </summary>
/// <param name="source">16进制转的数组</param>
/// <param name="length">数组长度</param>
/// <param name="offset">偏移值</param>
/// <returns></returns>
public static int CRC8_ITU(byte[] source, int length, int offset = 0)
{
int wCRCin = 0x00;
int wCPoly = 0x07;
for (int i = offset, cnt = offset + length; i < cnt; i++)
{
for (int j = 0; j < 8; j++)
{
bool bit = ((source[i] >> (7 - j) & 1) == 1);
bool c07 = ((wCRCin >> 7 & 1) == 1);
wCRCin <<= 1;
if (c07 ^ bit)
wCRCin ^= wCPoly;
}
}
wCRCin &= 0xFF;
return wCRCin ^= 0x55;
}
/// <summary>
/// CRC-8/MAXIM x8+x5+x4+1
/// </summary>
/// <param name="source">16进制转的数组</param>
/// <param name="length">数组长度</param>
/// <param name="offset">偏移值</param>
/// <returns></returns>
public static int CRC8_MAXIM(byte[] source, int length, int offset = 0)
{
int wCRCin = 0x00;
int wCPoly = 0x8C;
for (int i = offset, cnt = offset + length; i < cnt; i++)
{
wCRCin ^= source[i] & 0xFF;
for (int j = 0; j < 8; j++)
{
if ((wCRCin & 0x01) != 0)
{
wCRCin >>= 1;
wCRCin ^= wCPoly;
}
else
{
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0x00;
}
/// <summary>
/// CRC8-ROHC x8+x2+x+1
/// </summary>
/// <param name="source">16进制转的数组</param>
/// <param name="length">数组长度</param>
/// <param name="offset">偏移值</param>
/// <returns></returns>
public static int CRC8_ROHC(byte[] source, int length, int offset = 0)
{
int wCRCin = 0xFF;
// Integer.reverse(0x07) >>> 24
int wCPoly = 0xE0;
for (int i = offset, cnt = offset + length; i < cnt; i++)
{
wCRCin ^= source[i] & 0xFF;
for (int j = 0; j < 8; j++)
{
if ((wCRCin & 0x01) != 0)
{
wCRCin >>= 1;
wCRCin ^= wCPoly;
}
else
{
wCRCin >>= 1;
}
}
}
return wCRCin ^= 0x00;
}
/// <summary>
/// CRC-16/MODBUS x16+x15+x2+1
/// </summary>
/// <param name="bytes">16进制转的数组</param>
/// <returns></returns>
public static string CRC16_MODBUS(byte[] bytes)
{
int CRC = 0x0000ffff;
int POLYNOMIAL = 0x0000a001;
int i, j;
for (i = 0; i < bytes.Length; i++)
{
CRC ^= (int)bytes[i];
for (j = 0; j < 8; j++)
{
if ((CRC & 0x00000001) == 1)
{
CRC >>= 1;
CRC ^= POLYNOMIAL;
}
else
{
CRC >>= 1;
}
}
}
var result = Convert.ToString(CRC, 16);
result = result.Insert(2, " ");
return result.ToUpper();
}