# Simple md5 question - leading zeros

hi,

I have come across this code at many places on net

StringBuffer hexString = new StringBuffer();
for (int i=0; i < digest.length; i++) {
String hex = Integer.toHexString(0xFF & digest[i]);
if (hex.length() == 1) {
hexString.append("0" + hex);
} else {
hexString.append(hex);
}
}

my question is -- what's the use of doing
0xFF & digest[i]

Thnx...
LVL 3
###### Who is Participating?

x

Commented:
That's because you're using an integer literal instead of a byte and those values will not be sign extended. Try this

byte b = (byte)0x80; // (-128)
System.out.println(Integer.toHexString(b));
0

Commented:
That would be to 'unsign' the byte value, which of course is a signed type
0

Author Commented:
thnx cehj, can u explain li'l more...

how can a byte value be signed.. and how this operation will make difference
0

Commented:
It's actually not only to unsign it - it's to ensure the value does not exceed 0xFF after being passed to Integer.toHexString. Let's assume that digest[i] is itself 0xFF (-1)

Integer.toHexString(0xFF)

would produce

"ffffffff"

because of 'sign extension'. ANDing 0xFF with 0xFF would produce as a hex int

000000FF, and when that int is passed to Integer.toHexString, you'd get

"ff", which is what you want
0

Author Commented:
cehj,
can u also give me a code to demonstrate this. I tried
"System.out" ing the Integer.toHexString(0xff) and Integer.toHexString(0xff & 0xff)
but both are printing out the same thing
i.e 0xff

Thanks,
0

Author Commented:
sorry, they are printing out ff instead.
0

Author Commented:
thnx cehj
0

Commented:
8-)

Rather than calling Integer.toHexString, you may find the following more efficient:

System.out.println(byteArrayToHexString(new byte[] { (byte)0xca, (byte)0xfe, (byte)0xba, (byte)0xbe}));

...........

public static String byteArrayToHexString(byte[] rawBytes) {
String charIndex = "0123456789abcdef";
StringBuffer sb = new StringBuffer(rawBytes.length * 2);
for (int i = 0; i < rawBytes.length; i++) {
int ix = (rawBytes[i] >> 4) & 0xF;
sb.append(charIndex.charAt(ix));
ix = rawBytes[i] & 0xF;
sb.append(charIndex.charAt(ix));
}
return sb.toString();
}
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.