Sé que esto parece una pregunta amplia, pero puedo limitarla con un ejemplo. Soy MUY nuevo en Java. Para uno de mis proyectos de "aprendizaje", quería crear un hasher de archivo MD5 interno para que lo usemos. Empecé de manera muy simple intentando manipular una cadena y luego pasar a un archivo más adelante. He creado un archivo llamado MD5Hasher.java y escribió lo siguiente:¿Cómo va una persona a aprender Java? (convertir matriz de bytes a cadena hexadecimal)
import java.security.*;
import java.io.*;
public class MD5Hasher{
public static void main(String[] args){
String myString = "Hello, World!";
byte[] myBA = myString.getBytes();
MessageDigest myMD;
try{
myMD = MessageDigest.getInstance("MD5");
myMD.update(myBA);
byte[] newBA = myMD.digest();
String output = newBA.toString();
System.out.println("The Answer Is: " + output);
} catch(NoSuchAlgorithmException nsae){
// print error here
}
}
}
Visité java.sun.com para ver los javadocs para java.security para averiguar cómo utilizar MessageDigest clase. Después de leer, supe que tenía que usar un método "getInstance" para obtener un objeto MessageDigest utilizable que pudiera usar. El Javadoc continuó diciendo "Los datos se procesan a través de él utilizando los métodos de actualización". Así que miré los métodos de actualización y determiné que necesitaba usar el que lo alimentaba con una matriz de bytes de mi cadena, así que agregué esa parte. El Javadoc pasó a decir: "Una vez que se actualicen todos los datos que se actualizarán, se debe llamar a uno de los métodos de resumen para completar el cálculo de hash". Una vez más, miré los métodos y vi que el resumen devolvía una matriz de bytes, así que agregué esa parte. Luego usé el método "toString" en la nueva matriz de bytes para obtener una cadena que podría imprimir. Sin embargo, cuando compilé y corrió el código todo lo que imprimió fue la siguiente:
La respuesta es: [B @ 4cb162d5
he hecho algunos mirando por aquí en StackOverflow y se encontró alguna información aquí:
How can I generate an MD5 hash?
que dio el siguiente ejemplo:
String plaintext = 'your text here';
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32){
hashtext = "0"+hashtext;
}
parece que la única parte que MAY falta es la parte "BigInteger", pero no estoy seguro.
Entonces, después de todo esto, creo que lo que estoy preguntando es, ¿cómo sabes utilizar la parte "BigInteger"? Supuse erróneamente que el método "toString" en mi objeto newBA lo convertiría en una salida legible, pero aparentemente estaba equivocado. ¿Cómo se supone que una persona debe saber qué camino tomar en Java? Tengo un fondo en C así que esta cosa de Java parece bastante extraña. ¿Algún consejo sobre cómo puedo mejorar sin tener que "hacer trampas" buscando en Google cómo hacer algo todo el tiempo?
Gracias a todos por tomarse el tiempo para leer. :-)
de la manera difícil :) – Bozho
Parte de ser un buen programador es aprender quién y cuáles son sus recursos, y cuándo y cómo usarlos. Google es un recurso, y no hay vergüenza en usarlo y abusar de él para convertirte en un desarrollador más experimentado. Otros recursos son tus compañeros desarrolladores y/o libros de autoaprendizaje. – Jagd
posible duplicado de [¿Cuáles son los mejores recursos para aprender Java (libros, sitios web, etc.)?] (Http://stackoverflow.com/questions/77839/what-are-the-best-resources-for-learning- java-books-websites-etc) – gnovice