Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

BigInteger.toString method is deleting leading 0

I am trying to generate MD5 sum using MessageDigest. And i am having following code.

byte[] md5sum = digest.digest(); BigInteger bigInt = new BigInteger(1, md5sum); output = bigInt.toString(16); 

This returns not 32 character string but a 31 character string 8611c0b0832bce5a19ceee626a403a7

Expected String is 08611c0b0832bce5a19ceee626a403a7

Leading 0 is missing in the output.

I tried the other method

byte[] md5sum = digest.digest(); output = new String(Hex.encodeHex(md5sum)); 

And the output is as expected.

I checked the doc and Integer.toString does the conversion according to it

The digit-to-character mapping provided by Character.forDigit is used, and a minus sign is prepended if appropriate.

and in Character.forDigit methos

The digit argument is valid if 0 <=digit < radix.

Can some one tell me how two methods are different and why leading 0 is deleted?

like image 322
Dheeraj Joshi Avatar asked Apr 23 '12 06:04

Dheeraj Joshi


People also ask

How do you keep leading zeros in Java?

You just need to add "%03d" to add 3 leading zeros in an Integer. Formatting instruction to String starts with "%" and 0 is the character which is used in padding. By default left padding is used, 3 is the size and d is used to print integers.

How do you store strings in BigInteger?

One way is to use the BigInteger(String value, int radix) constructor: String inputString = "290f98"; BigInteger result = new BigInteger(inputString, 16); assertEquals("2690968", result. toString()); In this case, we're specifying the radix, or base, as 16 for converting hexadecimal to decimal.


2 Answers

I would personally avoid using BigInteger to convert binary data to text. That's not really what it's there for, even if it can be used for that. There's loads of code available to convert a byte[] to its hex representation - e.g. using Apache Commons Codec or a simple single method:

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); } 
like image 108
Jon Skeet Avatar answered Sep 20 '22 04:09

Jon Skeet


String.format("%064X", new BigInteger(1, ByteArray);

where

  1. 0 - zero leading sign
  2. 64 - string length
  3. X - Uppercase
  4. ByteArray - The ByteArray on which you want to run this operation
like image 39
Gorets Avatar answered Sep 18 '22 04:09

Gorets