一種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;
}