一種CRC算法的C、C#和Java版本的實現

一種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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章