java汉明码解密

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java汉明码解密相关的知识,希望对你有一定的参考价值。

前言:最近由于学校的比赛,接触了汉明码解密,在这里给大家分享一下(只用了几种比较简单的方法)。

当时题目是 使用给的原始信息由6个ASCII码(7bit)字符构成,经过汉明码编码后得到6字节的数据,使用该数据作为红外线控制码。具体代码如下(因为是自学所以编码可能不太规范):

  1 1 public class asf {
  2   2     static String rtun="ABCASD";
  3   3     static int dx=1,j=0,b=0,z=0,m=0,k=0,b1=0,b2=0,b3=0;
  4   4     static String ch="";
  5   5     static String a1="";
  6   6     static String a2="";
  7   7     static String a3="";
  8   8     static String ch1="";
  9   9     static String zhongjian;
 10  10     static char zifu;
 11  11     static char a=‘1‘;
 12  12     static int h=1;
 13  13 public static void main(String[] args) throws Exception {
 14  14     System.out.print(a1);
 15  15     for(int i=0;i<rtun.length();i++){
 16  16         char c=rtun.charAt(i);
 17  17         //判断字符串中的大写字母
 18  18         if(((int)c>=65)&&((int)c<=90)){
 19  19             a1=a1+(char)c;
 20  20             b1++;
 21  21         }
 22  22         //判断是否为字符串中的小写字母
 23  23         else if(((int)c>=97)&&((int)c<=122)){
 24  24             b2++;
 25  25             a2=a2+(char)c;
 26  26         }//剩下的字符
 27  27         else{
 28  28             a3=a3+(char)c;
 29  29             b3++;
 30  30         }
 31  31     }
 32  32     for(int j2=0;j2<a1.length();j2++){
 33  33         //转变为二进制数
 34  34         
 35  35         /* 进行拼接
 36  36          * 字符串之间的拼接
 37  37          * 注意:
 38  38          *   低位是第一个   高位是最后一个
 39  39          */
 40  40         zifu = a1.charAt(j2);
 41  41         zhongjian =(String)Integer.toBinaryString(zifu);
 42  42         //System.out.print(zhongjian);
 43  43         //假如是数字的话 前边补零
 44  44         while(zhongjian.length()<7)
 45  45         {
 46  46             zhongjian=‘0‘+zhongjian;
 47  47         }
 48  48         ch1=ch1+zhongjian;
 49  49 }    
 50  50     //System.out.print(ch1);
 51  51     for(int i=1;i<ch1.length()+7;i++){
 52  52     if(i==dx){
 53  53             dx = dx*2;
 54  54             zifu=‘ ‘;
 55  55         }else{
 56  56             zifu = ch1.charAt(j);
 57  57             j++;
 58  58         }
 59  59         ch=ch+zifu;
 60  60     }
 61  61     //System.out.print("/n");
 62  62     //System.out.print(ch);
 63  63     //System.out.print("/n");
 64  64     //把“数据”行值为1的位置值进行二进制编码异或
 65  65     int hu=0xff;
 66  66     for(int i=0;i<ch.length();i++){
 67  67         zifu=ch.charAt(i);
 68  68         if(a==zifu){
 69  69             int[] shuju=new int[100]; 
 70  70             shuju[z] = i+1;
 71  71             System.out.println(shuju[z]);
 72  72             if(h==1)
 73  73             {
 74  74                 //System.out.print(i);
 75  75                 hu=shuju[z];
 76  76                 z++;
 77  77                 h--;
 78  78             }
 79  79             else
 80  80             {
 81  81             hu = hu ^ shuju[z];
 82  82             //System.out.println(hu);
 83  83             z++;
 84  84             }
 85  85         }
 86  86         
 87  87     }
 88  88     //得来的数据进行二进制编码
 89  89     String shu="";
 90  90     shu = Integer.toBinaryString(hu);
 91  91     while(shu.length()!=6)
 92  92     {
 93  93         shu = ‘0‘ + shu;
 94  94     }
 95  95     System.out.println(shu);
 96  96     //对效验码进行逆顺序排列
 97  97     String nima="";
 98  98     for(int i=shu.length()-1;i>=0;i--){
 99  99         nima=nima + shu.charAt(i);
100 100     }
101 101     //把效验码填入到数据中
102 102     String numb="";
103 103     for(int i=0;i<ch.length();i++){
104 104         if(ch.charAt(i)==‘ ‘){
105 105             numb = numb + nima.charAt(m);
106 106             m++;
107 107         }else{
108 108             numb = numb + ch.charAt(i);
109 109         }
110 110     }
111 111     System.out.println(numb);
112 112     char yu;
113 113     String stry="";
114 114     int[] str= new int[6];
115 115         for(int i=0;i<numb.length();i++){
116 116         yu=numb.charAt(i);
117 117         stry=stry + yu;
118 118         if((i+1)%8==0){
119 119             //把字符串二进制变为十进制
120 120             String asd = Integer.valueOf("0101",2).toString();
121 121             int ddy =  Integer.parseInt(asd);
122 122             //十进制转化为十六进制
123 123             String ssa = Integer.toHexString(ddy);
124 124             //int n = OxStringtoInt(ssa);
125 125            
126 126         }
127 127     }
128 128   }
129 129 }

 

以上是关于java汉明码解密的主要内容,如果未能解决你的问题,请参考以下文章

汉明码(海明码)计算方法

汉明码是如何校验的,比如一道题:设数据为01101001,试采用4个校验位求其偶校验方式的汉明码

汉明码(海明码)解析

汉明码(海明码)解析

汉明校验码

AR专用汉明码