javacrc16演算法
㈠ 請將CRC16的C語言演算法,改造為java語言演算法,萬分感謝!
public static int CRC16(byte[] Buf, int Len) {
int CRC;
int i, Temp;
CRC = 0xffff;
for (i = 0; i < Len; i++) {
CRC = CRC ^ byteToInteger(Buf[i]);
// System.out.println(byteToInteger(Buf[i]));
for (Temp = 0; Temp < 8; Temp++) {
if ((CRC & 0x01) == 1)
CRC = (CRC >> 1) ^ 0xA001;
else
CRC = CRC >> 1;
}
}
return CRC;
}
㈡ java中CRC演算法是個什麼東東
CRC校驗碼的基本思想是利用線性編碼理論,在發送端根據要傳送的k位二進制碼序列,以一定的規則產生一個校驗用的監督碼(既CRC碼)r位,並附在信息後邊,構成一個新的二進制碼序列數共(k+r)位,最後發送出去。在接收端,則根據信息碼和CRC碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。
在數據存儲和數據通訊領域,CRC無處不在:著名的通訊協議X.25的FCS(幀檢錯序列)採用的是CRC. CCITT,ARJ、LHA等壓縮工具軟體採用的是CRC32,磁碟驅動器的讀寫採用了CRC16,通用的圖像存儲格式GIF、TIFF等也都用CRC作為檢錯手段。
CRC的本質是模-2除法的余數,採用的除數不同,CRC的類型也就不一樣。通常,CRC的除數用生成多項式來表示。最常用的CRC碼的生成多項式有CRC16,CRC32.
以CRC16為例,16位的CRC碼產生的規則是先將要發送的二進制序列數左移16位(既乘以2^16)後,再除以一個多項式,最後所得到的余數既是CRC碼,如下式所示,其中K(X)表示n位的二進制序列數,G(X)為多項式,Q(X)為整數,R(X)是余數(既CRC碼)。
K(X)>>16=G(x)Q(x)+R(x)
求CRC碼所採用模2加減運演算法則,既是不帶進位和借位的按位加減,這種加減運算實際上就是邏輯上的異或運算,加法和減法等價,乘法和除法運算與普通代數式的乘除法運算是一樣,符合同樣的規律。生成CRC碼的多項式如下,其中CRC-16和CRC-CCITT產生16位的CRC碼,而CRC-32則產生的是32位的CRC碼
接收方將接收到的二進制序列數(包括信息碼和CRC碼)除以多項式,如果余數為0,則說明傳輸中無錯誤發生,否則說明傳輸有誤,關於其原理這里不再多述。用軟體計算CRC碼時,接收方可以將接收到的信息碼求CRC碼,比較結果和接收到的CRC碼是否相同。
CCITT推薦的高級數據鏈路控制規程HDLC的幀校驗序列FCS中,使用CCITT-16即CRC16,其生成多項式為G(x)=x16+x12+x5+1,CRC-32的生成多項式為G(x)=x32+x26+x23+x22+x16+x11+x10+x16+x8+x7+x5+x4+x2+x+1
㈢ 求助,一段C的CRC校驗演算法,需要翻譯成JAVA,感謝
publicstaticshortCRC16_WifiAllBtye(Numberdata,shortlen){
intcksum=0;
inttmp_32=0;
shorttmp_8=0;
shortp=data.shortValue();
if(data!=null){
while(len>1){
tmp_8=p++;
tmp_32=(int)(p++);
cksum+=tmp_32<<8;
cksum+=(int)tmp_8;
len-=2;
}
if(len>=0){
cksum+=(int)p;
}
cksum=(cksum>>16)+(cksum&0xFFFF);
cksum+=(cksum>>16);
}
return(short)(~cksum);
}