java - example - El método BigInteger.toString está eliminando 0 inicial
int to biginteger java (5)
String.format ("% 064X", nuevo BigInteger (1, hmac.doFinal (message.getBytes ())));
dónde
- 0 - cero signo principal
- 64 - longitud de la cuerda
- X - mayúsculas
Estoy tratando de generar la suma MD5 utilizando MessageDigest. Y estoy teniendo el siguiente código.
byte[] md5sum = digest.digest();
BigInteger bigInt = new BigInteger(1, md5sum);
output = bigInt.toString(16);
Esto devuelve no una cadena de 32 caracteres sino una cadena de 31 caracteres 8611c0b0832bce5a19ceee626a403a7
La cadena esperada es 08611c0b0832bce5a19ceee626a403a7
Falta 0 en la salida.
Probé el otro método
byte[] md5sum = digest.digest();
output = new String(Hex.encodeHex(md5sum));
Y la salida es la esperada.
Revisé el documento y Integer.toString realiza la conversión de acuerdo con él.
Se utiliza la asignación de dígitos a caracteres proporcionada por Character.forDigit, y se añade un signo menos si corresponde.
y en caracteres.
El argumento del dígito es válido si 0 <= dígito <radix.
¿Puede alguien decirme cómo dos métodos son diferentes y por qué se borra el 0 inicial?
El cero eliminado se reemplaza usando este código:
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.reset();
digest.update(output.getBytes());
byte[] outDigest = digest.digest();
BigInteger outBigInt = new BigInteger(1,outDigest);
output = outBigInt.toString(16);
while (output.length() < 32){
output = "0"+output;
}
el bucle contará por tantos ceros iniciales como sea necesario
Personalmente evitaría usar BigInteger
para convertir datos binarios a texto. Eso no es realmente para lo que está ahí, incluso si se puede usar para eso. Hay un montón de código disponible para convertir un byte[]
a su representación hexadecimal, por ejemplo, usando Apache Commons Codec o un método simple y simple:
private static final char[] HEX_DIGITS = "0123456789ABCDEF".toCharArray();
public static String toHex(byte[] data) {
char[] chars = new char[data.length * 2];
for (int i = 0; i < data.length; i++) {
chars[i * 2] = HEX_DIGITS[(data[i] >> 4) & 0xf];
chars[i * 2 + 1] = HEX_DIGITS[data[i] & 0xf];
}
return new String(chars);
}
Se elimina porque el cero BigInteger
no es significativo, según BigInteger
. No hay diferencia entre 27
y 000000000027
.
Si quieres una longitud específica, tendrás que forzarla tú mismo, con algo como:
output = ("00000000000000000000000000000000"+output).substring(output.length());
(kludgy aunque eso es).
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(PlainText.getBytes(),0,PlainText.length());
String M1=new BigInteger(1,m.digest()).toString(16);
return M1;