計算機網絡數據鏈路層的錯誤檢測與糾正之海明碼的生成,解碼

<!-- lang: java -->
 /**
 * made by wangming 
 * 
 * 2013-10-28  pm
 */

package wang.ming.data;
 public class Analysis {

 //生成海明碼	

public static int[] HaiMingMa(int original[],int len ){

int checkBits=length(len);    //計算須要多長的校驗碼
int size=len+checkBits;        //發送的數據長度
int send[]=new int[size];
int o_s=0;   //original當前的偏移量

//初始化
for(int i=0;i<size;i++){
	if(canFit(i+1, checkBits)){
		send[i]=original[o_s];
		o_s++;
	}else {
		send[i]=0;
	}
}

for(int i=0;i<checkBits;i++){
	int fill=0;
	for(int j=1;j<=size;j++){
		if(canFit(j, checkBits)){
			if(in(j, i, checkBits)){
				fill=XOR(fill, send[j-1]);
			}
		}
	}
	int id=(int)Math.pow(2, (double)i);
	send[id-1]=fill;
}	
return send;
  }

       /*
        * 接受海明碼  並進行處理
        */
 public static int[]receive(int send[]){
    	int size=send.length;
    	int bits=codeLength(size);
        int errorBit=check(send, bits,size);
        int []receive = new int[size-bits];
        if(errorBit>0){
        	System.out.println("第"+errorBit+"出錯了");
    	}
        if(!canFit(errorBit, bits)){
	    System.out.println("出錯的是校驗碼,不影響結果");
        }
        int index=0;
        for(int i=0;i<size;i++){
        	if(canFit(i+1, bits)){
		    if((i+1)!=errorBit){
		       receive[index]=send[i];
		    }else{
			receive[index]=XOR(send[i], 1);
			//對出錯的地方進行處理   與1異或便可獲得原來的值
		    }
		      index++;
	    }
        }
    return  receive;
       }

        /*
         * 判斷接受的海明碼是否出錯
         */
    public static int check(int receive[],int bits,int size){
    	int errorBit=0;
        for(int j=0;j<bits;j++){
	    int flag=0;
	    for(int i=0;i<size;i++){
		if(canFit(i+1, bits)){
			if(in(i+1, j, bits)){
				flag=XOR(flag, receive[i]);
			}
		}
	}
	int index=(int)Math.pow(2, (double)j)-1;
	flag=XOR(flag, receive[index]);
	if(flag==1){
		errorBit+=(int)Math.pow(2, (double)j);
	    }
        }
        return errorBit;
     }

    /*
     * x=a*(2*2...*2)+b*(2*2...*2)+...+c*2+d
     *     [-bits-1-]   [-bits-2-]      
     *     其中常數a,b,c..等於0,1
     *     若是 2的y次方前的常數爲1   return true
     *     爲0   return false 
     */
    public static boolean in(int x,int y,int bits){
    	int dive[]=new int[bits];
    	int index=0;
    	for(int i=bits-1;i>=0;i--){
    		if(x/(int)Math.pow(2, (double)i)>0){
		dive[index]=1;
	}else{
		dive[index]=0;
	}
	x=x%(int)Math.pow(2, (double)i);
	index++;
    	}
    	if(dive[bits-y-1]==1){
    		return true;
    	}
    	return false;
        }
    /*
     * 對兩個數作異或操做
     * 相等   return 0
     * 不然   return 1
     */
    public static int XOR(int x,int y){
    	if((x-y)==0){
    		return 0; 
    	}else{
    		return 1;
    	}
    }
    /*
     * 返回 true   or   false
     * 若是index是2的n次方   false
     * 不然  true
     */
    public static boolean canFit(int index,int checkBits){
    	for(int i=0;i<checkBits;i++){
    		if(index==Math.pow(2, (double)i)){
    			return false;
    		}
    	}
    	return true;
    }

    /*
     * 由海明碼反向推出校驗碼位數
     */
    public static int codeLength(int len){
    	int num=0;
    	while((++num)>0){
    		//逆向判斷
    		if((double)(len)<=Math.pow(2, (double)num)){
    			return num;
    		}	
    		if(num>20){
    			return -1;
    		}
    	}
    	return -1;
    }

    /*  給定須要傳輸的原始數據
     *  返回須要的校驗碼的位數
     *  len+x+1<=(2*2*2....*2)   
     *        [-----x-----]
     */
    public static int  length(int len){
    	int num=0;
    	while((++num)>0){
    		//校驗碼位數的判斷條件
    		if((double)(num+len+1)<=Math.pow(2, (double)num)){
    			return num;
    		}	
    		if(num>20){
    			return -1;
    		}
    	}
    	return -1;
    }
    
    public static void main(String[] args) {
        System.out.println( Analysis.in(1, 0, 4));
        int code[]={1,0,1,1,0};
        int receive[]= Analysis.HaiMingMa(code, 5);
        receive[6]=0;
        System.out.println(Analysis.check(receive, 4,9));
        int recovery[]=Analysis.receive(receive);
    	for(int i=0;i<recovery.length;i++ ){
    		System.out.print(recovery[i]);
    	}
    	
    	}
    }
相關文章
相關標籤/搜索