Quiero dar gracias a todos en especial los que me han respondido los post anteriores, pero aun asi ahora necesito otra pequeña modificación (creo).
El objetivo es hacer un programa que implemente un codificador CRC con el polinomio generador x^16 + x^12 + x^5 +1 (0x8408).
La tarea consistira en procesar un fichero de modo que el primer byte del fichero es el primer byte que se introduce en el codificador, y que el bit más significativo de cada byte se procesa antes que los menos significativos a la hora de entrar en dicho codificador.
Al programa deberemos pasarle como argumento el nombre del fichero a procesar.
Finalmente presentará el CRC como entero en formato hexadecimal considerando el bit mas a la derecha como el menos significativo.
Por ejemplo supongamos un fichero llamado entrada.bin de 4 bytes cuyo contenido es "00 01 02 03". Tras la ejecucion del programa debería salir por pantalla "8c86".
Como podeis comprobar ya he puesto varios post anteriores pero en ninguno de los casos anteriores me da ese valor.
Me dan valores reales de CRC (XMODEM y CCITT respectivamente), pero ninguno me da el CRC "concreto" de este caso.
¿Alguien donde puede estar el fallo en los ejemplos anteriores?
Tambien tengo este ejemplo realizado por un compañero mio, el cual funciona de la forma que quiero pero no soy capaz de hacer uno que sea mas o menos distinto pero que haga lo mismo:
import java.io.*; //Instruccion necesaria para poder acceder a ficheros
class crc{ //Clase que crea un objeto de tipo algoritmo y lo llama
public static void main(String[] args){
algoritmo a = new algoritmo();
a.Leefichero(args);
}
}
class algoritmo{ //Clase que lee los datos del archivo de entrada calcula la redundancia
public void Leefichero(String[] args){
int G = 0x8408; //Variable que almacenará el polinomio generador
int Red = 0x0000; //Variable que almacenará el valor de la redundancia
String salida; //Variable de tipo string que almacenará el valor de la salida
try{
InputStream w = new FileInputStream(args[0]); //Crea el objeto necesario para la apertura del fichero y lo abre
DataInputStream f = new DataInputStream(w);
for (int i=0; f.available() > 0; i++){ //Bucle que se repite mientras quede algún byte sin leer
int X = 0; //Crea una variable entera que se encargara de almacenar el valor del bit que entra en el decodificador
int mascara = 0x0080; //Mascara que se desplaza bit a bit para obtener el valor de cada bit del byte leido
int entrada = (int)f.readByte(); //Lectura del byte del fichero
for (int j=0; j < 8; j++){
if ((entrada & mascara) != 0x0000){ //Calcula si el bit j del byte vale 0 o 1
X = 1;
}else{X = 0;}
mascara = mascara >>= 1; //Desplazamiento de la mascara que calcula el valor del bit
if ((Red % 2) == 1){ //Si el bit desplazado es uno, provoca un cambio en el bit de entrada
if (X == 1){
X=0;
}else{X=1;}
}
Red = ((Red >>=1) ^ X*G); //Actualiza la redundancia
}
}
w.close(); //Cierra el fichero y lo libera de la memoria
}catch (Exception e){ //Código que se ejecuaría si fallara el codigo del try
System.out.println("Error: " + e);
System.exit(1);
}
salida = Integer.toHexString(Red); //Convierte el valor de la redundancia a hexadecimal
System.out.println(salida); //Imprime por pantalla el valor de salida (la redundancia)
}
}
Muchas gracias por toda vuestra ayuda.
Un abrazo a todos y gracias maestros!!!!