文档章节

计算机网络数据链路层的错误检测与纠正之海明码的生成,解码

落雪有声踏地无痕
 落雪有声踏地无痕
发布于 2013/10/28 17:41
字数 693
阅读 39
收藏 0
<!-- 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]);
    	}
    	
    	}
    }

© 著作权归作者所有

落雪有声踏地无痕
粉丝 1
博文 16
码字总数 8584
作品 0
济南
程序员
私信 提问
数据链路层(一、二)——差错控制

版权声明:欢迎转载,转载请注明出处:土豆洋芋山药蛋 https://blog.csdn.net/qq_33414271/article/details/82263116 一、前言 数据链路层负责通过一条链路从一个结点向另一个物理链路直接相...

土豆洋芋山药蛋
2018/08/31
0
0
2009年上半年网工考试试题分析10-20

● E载波是ITU-T建议的传输标准,其中E3信道的数据速率大约是 (11) Mb/s。贝尔系统T3信道的数据速率大约是 (12)Mb/s。 (11)A. 64 B. 34 C. 8 D. 2 (12)A. 1.5 B. 6.3 C. 44 D. 274 ...

flywhale
2012/10/11
0
0
计算机网络知识点(三)

Chapter3 数据链路层 数据链路层解决下一步怎么走的问题 向网络层提供一个定义良好的服务接口 处理传输错误 从网络层获取分组,并且将分组封装到帧中以便传输。每一个帧包含一个帧头,一个静...

球球球球弱
2017/12/11
0
0
网络--严伟笔记

物理层 数据链路层 重要的内容有三部分:1 组帧,2 容错,3 流量控制。 海明码 是一种可以纠正一位差错的编码。它是利用在信息位为k位,增加r位冗余位,构成一个n=k+r位的码字,然后用r个监督...

evsqiezi
2017/10/15
0
0
海明码校验程序设计

需求分析 (1)海明码编码: 输入:一串二进制数据串 输出:插入海明码后的二进制数据串 (2)海明码纠错: 输入:一串含海明码的二进制数据串 输出:通过海明码校验,检查该二进制串是否有错...

乐搏学院
2016/12/07
8
0

没有更多内容

加载失败,请刷新页面

加载更多

lua字符串和时间戳相互转换

1. 时间戳转成格式化字符串 直接利用函数os.date()将时间戳转化成格式化字符串.```local timestamp = 1561636137;local strDate = os.date("%Y/%m/%d %H:%M:%S", timestamp)print("strD......

书香神
31分钟前
0
0
代码规范

代码格式化 安装vscode插件:Prettier - Code formatter 格式化配置:将下列配置写入到vscode的settings.json文件 (遵照代码格式化) "prettier.disableLanguages": ["vue"], "prettier.......

TreeZhou0511
今天
4
0
python实现人工神经网络的一个例子

人工神经网络已经有无数的开源框架,比如tensorflow,caffe等,可以直接用。但最近需要做一个小样例,把基本思想讲一讲,因此自己写了一个demo,以供参考。 下面直接上代码,代码中有注释,比...

propagator
今天
5
0
远程dubugger

1、在tomcat的bin下/data/project/XXX/apache-tomcat-8.5.23/bin 在catalina.bat文件中新增如下即可 JAVA_OPTS="-Xmx1024m -Xms1024m -agentlib:jdwp=transport=dt_socket,server=y,suspend......

一只小青蛙
今天
2
0
jemter 连接MySQL

jemter 连接MySQL 点击测试计划,测试计划最后”添加目录或jar包到ClassPath“,点击浏览,添加mysql-connector.jar mysql-connector.jar的下载地址: https://mvnrepository.com/artifact/my...

xiaobai1315
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部