Foros del Web » Programación para mayores de 30 ;) » Java »

Programa que calcula el CRC

Estas en el tema de Programa que calcula el CRC en el foro de Java en Foros del Web. Hola tengo un problema con este programa que calcula el CRC. Lo que intento hacer es que el programa lea un fichero y me dea ...
  #1 (permalink)  
Antiguo 13/07/2008, 04:05
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 16 años, 4 meses
Puntos: 0
Sonrisa Programa que calcula el CRC

Hola tengo un problema con este programa que calcula el CRC.

Lo que intento hacer es que el programa lea un fichero y me dea el CRC correcto.

import java.io.*;

class CRC {

public static void main(String[] args) {

codificador cod = new codificador();
cod.Leefichero(args);
}
}

class codificador{

int[] tabla = {
0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78};


public void Leefichero(String[] args){

int crc = 0x0000;

try{

InputStream lector = new FileInputStream(args[0]); //Crea el objeto necesario para la apertura del fichero y lo abre
DataInputStream fichero = new DataInputStream(lector);

//byte[] bytes = args[0].getBytes();



for (byte b :lector) {
crc = (crc >>> 8) ^ tabla[(crc ^ b) & 0xff];
}



lector.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);
}

System.out.println("CRC = " + Integer.toHexString(crc));


}
}


El error me lo da en "for (byte b :lector)" , alguien podria ayudarme?

Muchas gracias y un saludo a todos
  #2 (permalink)  
Antiguo 13/07/2008, 13:43
Avatar de Xinef  
Fecha de Ingreso: marzo-2007
Mensajes: 202
Antigüedad: 17 años, 8 meses
Puntos: 7
Respuesta: Programa que calcula el CRC

Cita:
Iniciado por bonethugs Ver Mensaje
El error me lo da en "for (byte b :lector)"
Es que estás intentando hacer un recorrido sobre algo que no es "byte".

Prueba con esto:

Código PHP:
InputStream lector = new BufferedInputStream(new FileInputStream(args[0]));
            
int b;
        
while ((
lector.read()) != -1) {
     
crc = (crc >>> 8) ^ tabla[(crc b) & 0xff];

Lo único que se hace es recorrer "manualmente" el fichero... además lo he metido en un buffer, para optimizar las lecturas.

No lo he probado, pero debería funcionar.
  #3 (permalink)  
Antiguo 15/07/2008, 05:55
 
Fecha de Ingreso: julio-2008
Mensajes: 8
Antigüedad: 16 años, 4 meses
Puntos: 0
Respuesta: Programa que calcula el CRC

Muchas gracias. El programa funciona. Pero estoy comprobando el CRC que me saca y me da el CRC16 XMODEM y yo necesito en CRC16 CCITT.

Al leer un archivo de 4 bytes en hexadecimal que contiene: 00 01 02 03 me sale el crc 5bf7 y me debería salir 8c86. ¿Sabrias como arreglarlo?

Creo que el fallo está en que en mi programa el bit menos significativo es el primero que coge el programa y creo q tiene que coger el mas significativo primero.

Muchas gracias de corazón

Aqui tengo las caracteristicas:

CRC-16 CCITT generator polynomial:
Name : CRC-16 CCITT
Standards : CRC-CCITT
References : ITU X.25/T.30, ADCCP, SDLC/HDLC
Initializing value : FFFF
Finalizing value : 0000
Polynomial value : 1021 (Mirror value = 8408)
Polynom : x^16 + x^12 + x^5 + 1


CRC-16 XModem generator polynomial:
Name : CRC-16 XModem
Standards : CRC-XModem
References : -
Initializing value : 0000
Finalizing value : 0000
Polynomial value : 8408 (Mirror value = 1021)
Polynom : x^16 + x^12 + x^5 + 1

Última edición por bonethugs; 15/07/2008 a las 07:42
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:22.