views:

472

answers:

5

How can I convert the hashed result, which a byte array, to a string?

byte[] bytePassword = Encoding.UTF8.GetBytes(password);


            using (MD5 md5 = MD5.Create())
            {
                byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
            }  

So I need to convert byteHashedPassword to a string

+5  A: 

You can use Convert.ToBase64String and Convert.FromBase64String to easily convert byte arrays into strings.

David
+5  A: 
   public static string ToHex(this byte[] bytes, bool upperCase)
    {
        StringBuilder result = new StringBuilder(bytes.Length*2);

        for (int i = 0; i < bytes.Length; i++)
            result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));

        return result.ToString();
    }

You can then call it as an extension method:

string hexString = byteArray.ToHex(false);
Philippe Leybaert
what is the significance of upper casing?
Blankman
a matter of preference. That's why I added a parameter to my method, so the caller can choose
Philippe Leybaert
It's the difference between `c0de` and `C0DE`, that's all.
John Kugelman
No need to reinvent the wheel when you already have `Convert.ToBase64String()`
Eric Petroelje
oh ok, I thought there was more too it! how does your answer differ from Convert.ToBase64String(bytes)?
Blankman
A Base64 string is shorter. It uses all letters of the alphabet, digits and a few punctuation characters, so it's not hexadecimal. Base64 uses 4 characters for 3 bytes, while a hex string uses 6 characters for 3 bytes.
Philippe Leybaert
@Eric: there are situations where Base64 is not a good choice because of the extra punctuation characters that are used (passing it in a URL for example)
Philippe Leybaert
+1  A: 

Well as it is a hash, it has possibly values that cannot be shown in a normal string, so the best bet is to convert it to Base64 encoded string.

string s = Convert.ToBase64String(bytes);

and use

byte[] bytes = Convert.FromBase64(s);

to get the bytes back.

Obalix
+1  A: 

Well, you could use the string constructor that takes bytes and an encoding, but you'll likely get a difficult to manage string out of that since it could contain lots of fun characters (null bytes, newlines, control chars, etc)

The best way to do this would be to encode it with base 64 to get a nice string that's easy to work with:

string s = Convert.ToBase64String(bytes);

And to go from that string back to a byte array:

byte[] bytes = Convert.FromBase64String(s);
Eric Petroelje
A: 

I always found this to be the most convenient:

string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");

For some odd reason BitConverter likes to put dashes between bytes, so the replace just removes them.

Update: If you prefer "lowercase" hex, just do a .ToLower() and boom.

Do note that if you are doing this as a tight loop and many ops this could be expensive since there are at least two implicit string casts and resizes going on.

GrayWizardx