一种CRC算法的C、C#和Java版本的实现
在很多需要进行数据通讯的项目中会需要用到CRC算法,而项目中可能会涉及到下位机和上位机两部分,然而上位机可能是由不同于C语言的C#或者Java语言写的。这里我就记录一下其中一种CRC用这三种不同的语言来实现的代码。以便后期好查看,当然,如果能帮到同样需要的朋友,那就再好不过了。
1. C语言实现代码
//CRC_CNT → 长度
Uint16 CrcCheck(Uint8 *Buf, Uint16 CRC_CNT)
{
Uint16 CRC_Temp;
Uint16 i,j;
CRC_Temp = 0xffff;
for (i=0;i<CRC_CNT; i++)
{
CRC_Temp ^= (Uint16)Buf[i];
for (j=0;j<8;j++)
{
if (CRC_Temp & 0x01)
CRC_Temp = (CRC_Temp >>1 ) ^ 0xa001;
else
CRC_Temp = CRC_Temp >> 1;
}
}
return(CRC_Temp);
}
2. C#语言实现代码
//返回的结果是要先转换为16进制,然后根据数据长度来在前面添加相应数目的0
public static char CrcCheck(byte[] Buf, int len)
{
char CRC_Temp;
int i,j;
CRC_Temp = (char)(0xffff);
for(i = 0; i < len; i++)
{
CRC_Temp = (char)(CRC_Temp ^ Buf[i]);
for(j = 0; j < 8; j++)
{
if(CRC_Temp & 0x01)
{
CRC_Temp = (char)((CRC_Temp >> 1) ^ 0xa001);
}
else
{
CRC_Temp = (char)(CRC_Temp >> 1);
}
}
}
return(CRC_Temp);
}
3. Java语言实现代码
//返回的结果是要先转换为16进制,然后根据数据长度来在前面添加相应数目的0
public static int CrcCheck(byte[] Buf, int len)
{
int temp;
int CRC_Temp;
int i,j;
CRC_Temp = 0xffff;
for(i = 0; i < len; i++) {
temp = Buf[i];
if (temp < 0)
temp += 256;
temp &= 0xff;
CRC_Temp ^= temp;
for(j = 0; j < 8; j++)
{
if((CRC_Temp & 0x0001) == 0x0001)
{
CRC_Temp = ((CRC_Temp >> 1) ^ 0xa001);
}
else
{
CRC_Temp = (CRC_Temp >> 1);
}
}
}
return(CRC_Temp);
}
4. 我自己用的C#版本 → 得到的结果直接转换为2byte的16进制字符
//返回结果的hexString
public static string CrcCheck(byte[] Buf)
{
string result = "";
int len = Buf.Length;
char CRC_Temp;
int i, j;
CRC_Temp = (char)(0xffff);
for (i = 0; i < len; i++)
{
CRC_Temp = (char)(CRC_Temp ^ Buf[i]);
for (j = 0; j < 8; j++)
{
if ((CRC_Temp & 0x01) != 0)
{
CRC_Temp = (char)((CRC_Temp >> 1) ^ 0xa001);
}
else
{
CRC_Temp = (char)(CRC_Temp >> 1);
}
}
}
result = Convert.ToString(CRC_Temp, 16).ToUpper();
if (result.Length == 1)
{
result = "000" + result;
}
else if (result.Length == 2)
{
result = "00" + result;
}
else if (result.Length == 3)
{
result = "0" + result;
}
return result;
}
5. 我自己用的Java版本 → 得到的结果直接转换为2byte的16进制字符
//数据更新CRC校验
//返回结果的hexString
public static String CrcCheck(byte[] Buf)
{
String result = "";
int len = Buf.length;
int temp;
int CRC_Temp;
int i,j;
CRC_Temp = 0xffff;
for(i = 0; i < len; i++) {
temp = Buf[i];
if (temp < 0)
temp += 256;
temp &= 0xff;
CRC_Temp ^= temp;
for(j = 0; j < 8; j++)
{
if((CRC_Temp & 0x0001) == 0x0001)
{
CRC_Temp = ((CRC_Temp >> 1) ^ 0xa001);
}
else
{
CRC_Temp = (CRC_Temp >> 1);
}
}
}
result = Integer.toHexString(CRC_Temp & 0xffff).toUpperCase();
if(result.length() == 1)
{
result = "000" + result;
}
else if(result.length() == 2)
{
result = "00" + result;
}
else if(result.length() == 3)
{
result = "0" + result;
}
return result;
}