Codice di hamming

Il codice di Hamming è semplicemente un metodo di controllo sulla correttezza nella ricezione di una certa quantità di dati.
In particolare questo algoritmo si propone di inserire in determinate posizioni del dato (quelle corrispondenti alle potenze del due: es. 1=2^0, 2=2^1 ecc) un bit che non fa parte dell’informazione inviata, ma che è inserita dal calcolatore per “controllare” alcune cifre successive.
In particolare si occupa banalmente di indicarne la parità o meno.

non badate a commenti bizzarri o di debug 😉
Se notate errori gravi commentate pure.
Il codice non è robusto.



import java.util.*;
import java.lang.Math;


public class Hamming {
/*
* converto le cifre binarie della posizione in un array di char, poi sommo il bit per ogni posizione
* controllata
*/
public static void main (String []args){

Scanner in = new Scanner (System.in);
System.out.println ("\t Calcolo del codice di hamming \n");
System.out.print("Inserisci il numero di bit di controllo (>=3) : ");
int h = Integer.parseInt(in.nextLine().trim());
int length= (int)Math.pow(2, h) -1 ; // dimensione stringa finale num+controlli
System.out.println(" dimensione stringa finale= "+length);
int controllo[]=new int[h]; // array dei codici di controllo
System.out.print(" Posizione codici di controllo : ");
for (int i=0; i controllo[i]=(int) Math.pow(2,i); // posizione dei cod di controllo
System.out.print ( controllo[i]);
}
// ------- INSERIMENTO INFORMAZIONE
System.out.println ("\n con "+h+" caratteri di controllo puoi inserire un'informazione di "+(length-h)+" bit");
System.out.print(" Inserisci i bit: ");
String info= in.nextLine().trim();
// manca controllo inserimento corretto
char arrayInfo[]= info.toCharArray();
//char arrayInfo[]={'0','1','1','0'};

//System.out.println( "dimensione info "+arrayInfo.length);
/*for (int i=0; i
System.out.print( arrayInfo[i]);
*/

// --------- COSTRUZIONE STRINGA
int j=0, k=0;
char [] hamming= new char[length];

System.out.print( " Posizione bit di controllo (stringa invertita!) : ");
for (int i=0; i// se è la posizione di un codice di controllo inserici X
if ( (k//System.out.print(" posizione "+i+" - controllo["+k+"] = "+(controllo[k]-1+" "));
hamming[i]='X'; // ....hammingCode(i,hamming[])
k++;
}
else{
if (j//System.out.print(" Posizione "+i+" = "+arrayInfo[j]+" ");
hamming[i]= arrayInfo[j];
j++;
}
}
System.out.print (hamming[i]);
}

System.out.println();

// ------------- CALCOLO CODICI DI HAMMING
System.out.print ("\n Stringa finale : ");
for (int i=0; i// per ogni x invoca la funzione
if ( hamming[i]=='X' ) hamming[i]=Integer.toString(hammingCode(i,hamming)).charAt(0);
}
// ------------- STAMPA INVERSA STRINGA
for (int i=hamming.length-1; i>=0 ;i--)
System.out.print (hamming[i]);

}

static String toBinario(int num){
// fino a quoziente 0
//int cifre= (int) (Math.log(num+1) / Math.log(2));
String s="";
while ( num != 0 ){
s =num%2+s;
num = num/2;
}
return s; //.toCharArray();
}

static int hammingCode(int i, char[] c){
int cont=0;
//System.out.println(" indice passato = "+i);
if (i==0) {
for (i+=1; i//System.out.println(" c["+(i+1)+"]="+ c[i]+" i%2="+((i+1)%2));
// somma tutti i bit degli indici dispari
if (( (i+1)%2 ==1 ) && ( c[i]=='1' ))
cont++;
}
}
else { // i=1 -> 2^1 ==> controlla 6,7
for (int k=(i+1); kString binario= toBinario(k);
//System.out.println("binario("+k+") = "+toBinario(k)+"-log2("+(i+1)+")= "+(binario.charAt( binario.length() - (int)(Math.log(i+1)/Math.log(2)))));

if (( binario.charAt( binario.length() - (int)(Math.log(i+1)/Math.log(2)) ) == '1') && (c[k]=='1'))
cont++;
}
}
//System.out.println(" risultato hammingcode "+cont+"%2= "+(cont%2) );
return (cont%2);
}

}