Solved

Simple md5 question - leading zeros

Posted on 2004-09-19
8
493 Views
Last Modified: 2008-01-16
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
Comment
Question by:kumvjuec
  • 4
  • 4
8 Comments
 
LVL 86

Expert Comment

by:CEHJ
ID: 12096622
That would be to 'unsign' the byte value, which of course is a signed type
0
 
LVL 3

Author Comment

by:kumvjuec
ID: 12096633
thnx cehj, can u explain li'l more...

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

Expert Comment

by:CEHJ
ID: 12096856
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
Networking for the Cloud Era

Join Microsoft and Riverbed for a discussion and demonstration of enhancements to SteelConnect:
-One-click orchestration and cloud connectivity in Azure environments
-Tight integration of SD-WAN and WAN optimization capabilities
-Scalability and resiliency equal to a data center

 
LVL 3

Author Comment

by:kumvjuec
ID: 12096928
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
 
LVL 3

Author Comment

by:kumvjuec
ID: 12096934
sorry, they are printing out ff instead.
0
 
LVL 86

Accepted Solution

by:
CEHJ earned 125 total points
ID: 12097008
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
 
LVL 3

Author Comment

by:kumvjuec
ID: 12097020
thnx cehj
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 12097062
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

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

For customizing the look of your lightweight component and making it look lucid like it was made of glass. Or: how to make your component more Apple-ish ;) This tip assumes your component to be of rectangular shape and completely opaque. (COD…
Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
Viewers learn about the scanner class in this video and are introduced to receiving user input for their programs. Additionally, objects, conditional statements, and loops are used to help reinforce the concepts. Introduce Scanner class: Importing…
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question