> Al cifrar me salen ficheros demasiado grandes. He escrito esto: ..."
> int nDatos = entrada.read(datos);
> while (nDatos > 0) {
> String texto = codificador.codifica(datos);
pues muy mal: sólo puedes codificar "nDatos";
repasa los métodos de la clase base64.Codificador.
> Al descifrar me salen ficheros demasiado grandes. He escrito esto: ..."
> int nDatos = entrada.read(datos);
> while (nDatos > 0) {
> String criptograma = new String(datos);
> String mensaje = descifrador.descifra(criptograma);
pues muy mal: sólo puedes descifrar "nDatos";
repasa los constructores de la clase String.
jueves, 29 de marzo de 2007
miércoles, 28 de marzo de 2007
e3: ¿cómo funciona read()?
Con bytes.
Si tenemos un lector de bytes
InputStream in= new FileInputStream("fichero");
necesitamos un sitio donde leer bytes: un array de tamaño T
byte[] datos= new byte[T];
Cada vez que llamamos a "read()" le pasamos el sitio donde queremos cargar bytes
int n= in.read(datos)
"read()" hace 2 cosas
1. carga bytes en el array "datos" (hasta un máximo de T, si lo hay)
2. nos devuelve en "n" cuántos bytes ha logrado cargar
Por eso, si "n <= 0" es que no hay nada que cargar: se ha acabado el fichero.
Y si "n > 0", podemos usar "n" datos: entre las posiciones "0" y "n-1" del array.
"read()" nunca lee dos veces los mismos datos, sino que en cada llamada va
avanzando por el fichero y lee los datos que hay a continuación.
De esta forma, llamando a "read()" dentro de un bucle,
vamos obteniendo los bytes sucesivos que contiene el fichero.
Con caracteres.
Lo mismo, pero cambiando "InputStream" por "Reader"
y "byte[]" por "char[]".
Si tenemos un lector de bytes
InputStream in= new FileInputStream("fichero");
necesitamos un sitio donde leer bytes: un array de tamaño T
byte[] datos= new byte[T];
Cada vez que llamamos a "read()" le pasamos el sitio donde queremos cargar bytes
int n= in.read(datos)
"read()" hace 2 cosas
1. carga bytes en el array "datos" (hasta un máximo de T, si lo hay)
2. nos devuelve en "n" cuántos bytes ha logrado cargar
Por eso, si "n <= 0" es que no hay nada que cargar: se ha acabado el fichero.
Y si "n > 0", podemos usar "n" datos: entre las posiciones "0" y "n-1" del array.
"read()" nunca lee dos veces los mismos datos, sino que en cada llamada va
avanzando por el fichero y lee los datos que hay a continuación.
De esta forma, llamando a "read()" dentro de un bucle,
vamos obteniendo los bytes sucesivos que contiene el fichero.
Con caracteres.
Lo mismo, pero cambiando "InputStream" por "Reader"
y "byte[]" por "char[]".
martes, 27 de marzo de 2007
e3: exactamente ¿cuántos datos leo?
Si haces algo así
byte[] datos= new byte[1024];
int n= inputStream.read(datos);
n puede ser cualquier número entre -1 y 1024.
Si es <=0, es que no hay nada que leer:
lo has leido todo y puedes acabar.
Si n > 0 has leído n datos, que están en las primeras n posiciones del array.
Para codificarlo, no puedes hacer
String codificada= codificador(datos);
sino que tendrás que usar otro método de la clase que sólo codifique n bytes
http://www.lab.dit.upm.es/~lprg/curso/e3/doc/base64/Codificador.html
--------------------
Algo parecido ocurre al descifrar,
int n= reader.read(datos);
De los n caracteres válidos en datos, hay que hacer una String,
mira los constructores disponibles:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html
byte[] datos= new byte[1024];
int n= inputStream.read(datos);
n puede ser cualquier número entre -1 y 1024.
Si es <=0, es que no hay nada que leer:
lo has leido todo y puedes acabar.
Si n > 0 has leído n datos, que están en las primeras n posiciones del array.
Para codificarlo, no puedes hacer
String codificada= codificador(datos);
sino que tendrás que usar otro método de la clase que sólo codifique n bytes
http://www.lab.dit.upm.es/~lprg/curso/e3/doc/base64/Codificador.html
--------------------
Algo parecido ocurre al descifrar,
int n= reader.read(datos);
De los n caracteres válidos en datos, hay que hacer una String,
mira los constructores disponibles:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html
e3: ¿qué eso de termina() del codificador?
Ocurre que para pasar a base64 se necesita un múltiplo entero de 3 bytes.
Si los datos que pasas a codificar no son un múltiplo entero de 3,
pues el decodificador sólo codifica los grupos de 3 que encuentra
y se guarda el resto para cuando le mandes codificar más
(empezará con los que tiene como restos de la última llamada).
Eso va muy bien mientras hay más bytes que leer,
pero cuando el fichero de entrada se acaba
hay que decirle al codificador que ya no guarde más,
sino que vacie los restos.
Para eso, al acabar, se llama a
String restos= codificador.termina();
... y esos restos hay que cifrarlos y escribirlos en la salida cifrada.
Aunque probablemente no lo necesites conocer en detalle,
si tienes curiosidad por eso del base64
puedes ilustrarte en la wikipedia:
http://en.wikipedia.org/wiki/Base64
para hacer el ejercicio basta con usar las clase del paquete base64.
Si los datos que pasas a codificar no son un múltiplo entero de 3,
pues el decodificador sólo codifica los grupos de 3 que encuentra
y se guarda el resto para cuando le mandes codificar más
(empezará con los que tiene como restos de la última llamada).
Eso va muy bien mientras hay más bytes que leer,
pero cuando el fichero de entrada se acaba
hay que decirle al codificador que ya no guarde más,
sino que vacie los restos.
Para eso, al acabar, se llama a
String restos= codificador.termina();
... y esos restos hay que cifrarlos y escribirlos en la salida cifrada.
Aunque probablemente no lo necesites conocer en detalle,
si tienes curiosidad por eso del base64
puedes ilustrarte en la wikipedia:
http://en.wikipedia.org/wiki/Base64
para hacer el ejercicio basta con usar las clase del paquete base64.
lunes, 26 de marzo de 2007
e3: ¿dónde están los ficheros?
Todo se hace a partir del sitio donde hayas puesto en ejercicio,
el código java y los ficheros de prueba.
Saco una foto de mi ordenador:
http://jungla.dit.upm.es/~pepe/doc/lprg/e3_msdos.png
el código java y los ficheros de prueba.
Saco una foto de mi ordenador:
http://jungla.dit.upm.es/~pepe/doc/lprg/e3_msdos.png
e3: ya lo he escrito todo pero ni funciona ni compila, ¿qué hago?
Salvo que tengas mucha experiencia, escribirlo todo y luego intentar compilar
puede ser bastante mala idea.
Lo ideal es escribir un poquito, poner trazas, compilar y ejecutar
(con trazas y, si ya es posible, con un caso de pruebas).
Cuando funcione un poquito, haces otro poquito y así, paso a paso,
acabarás mucho antes que con todo de golpe.
Bueno, nunca hay dos experiencias iguales; es un consejo.
puede ser bastante mala idea.
Lo ideal es escribir un poquito, poner trazas, compilar y ejecutar
(con trazas y, si ya es posible, con un caso de pruebas).
Cuando funcione un poquito, haces otro poquito y así, paso a paso,
acabarás mucho antes que con todo de golpe.
Bueno, nunca hay dos experiencias iguales; es un consejo.
domingo, 25 de marzo de 2007
e3: ¿cómo escribo caracteres en el fichero?
Esto está bien:
String cifrado= cifrador.cifra(...);
char[] caracteres= cifrado.toCharArray();
writer.write(caracteres);
Esto está también bien, y es más directo:
String cifrado= cifrador.cifra(...);
writer.write(cifrado);
String cifrado= cifrador.cifra(...);
char[] caracteres= cifrado.toCharArray();
writer.write(caracteres);
Esto está también bien, y es más directo:
String cifrado= cifrador.cifra(...);
writer.write(cifrado);
Suscribirse a:
Entradas (Atom)