Hash算法中的CRC


CRC是通信領域中用於校驗數據傳輸正確性的最常用機制,也是Hash算法的一個典型應用,Hash一般翻譯為“散列”,也可直接音譯為“哈希”,就是把任意長度的輸入(又叫做預映射,pre-image)通過散列算法變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是散列值的空間通常遠小於輸入空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值唯一的確定輸入值。

關於CRC校驗:(16位二進制數),CRC碼由發送設備計算,放置於所發送信息幀的尾部。接收信息的設備重新計算所接收信息(除RCR部分)的CRC,比較計算得到的
CRC是否與接收到的CRC相符,如果兩者不相符,則認為數據傳輸出錯,如果相符說明數據傳輸正確。
(1)預1個16位的寄存器為0xFFFF,稱此寄存器為CRC寄存器
(2)把分i一個8位二進制數據(即通信信息幀的第一個字節)與16位的CRC寄存器的低8位相異或,把結果存放於CRC寄存器
(3)把CRC寄存器的內容右移一位,用0填補最高位,並檢查右移后的移出位。
(4)如果移出位為0,重復(3),如果移出位為1,CRC寄存器與0xA001進行異或
(5)重復(3)(4),直到右移8次,這樣整個8位數據就全部進行了處理
(6)重復(2)到(5),進行通信信息幀下一個字節的處理
(7)將該通信信息幀所有字節按上述步驟計算完成后,得到的16位CRC寄存器的高、低位已經交換
(8)最后得到的CRC寄存器內容即為CRC碼

程序代碼如下:

#include <stdio.h>
unsigned short modbus_crc(unsigned char* p,int len)
{
	unsigned short ret=0xFFFF;
	int i=0;
	int k=0;

	for(i=0;i<len;++i)
	{
		ret^=p[i];
		for(k=0;k<8;++k)
		{
			ret=(ret&0x01)?((ret>>1)^0xA001):(ret>>1);
		}
	}
	ret=((ret&0xFFFF)<<8) | ((ret&0xFFFF)>>8);
	return ret;
}

int main()
{
	unsigned char input[]={0x01,0x04,0x0D,0x28,0x00,0x02,0x01,0x02,0x00,0x53,0x00,0x01};
	unsigned short out=0;
	int i=0;
	int len=sizeof(input);

	out=modbus_crc(input,sizeof(input));
	printf("Input:");
	for(i=0;i<len;i++)
		printf(" 0x%.2X",input[i]);
	printf("\nModbus CRC is: 0x%.4X\n",out);
	return 0;
}

 常見的Hash算法有:MAC,CRC,MD5/MD4,SHA等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM