[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 566
  • Last Modified:

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...
0
kumvjuec
Asked:
kumvjuec
  • 4
  • 4
1 Solution
 
CEHJCommented:
That would be to 'unsign' the byte value, which of course is a signed type
0
 
kumvjuecAuthor Commented:
thnx cehj, can u explain li'l more...

how can a byte value be signed.. and how this operation will make difference
0
 
CEHJCommented:
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
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
kumvjuecAuthor 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
 
kumvjuecAuthor Commented:
sorry, they are printing out ff instead.
0
 
CEHJCommented:
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
 
kumvjuecAuthor Commented:
thnx cehj
0
 
CEHJCommented:
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

Featured Post

The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

  • 4
  • 4
Tackle projects and never again get stuck behind a technical roadblock.
Join Now