library example java tostring biginteger

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

  1. 0 - cero signo principal
  2. 64 - longitud de la cuerda
  3. 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;