views:

493

answers:

4

Hi,

I'm trying to write a function that converts a string to a base64 byte array. I've tried with this approach:

public byte[] stringToBase64ByteArray(String input)
        {
            byte[] ret = System.Text.Encoding.Unicode.GetBytes(input);
            string s = Convert.ToBase64String(input);
            ret = System.Text.Encoding.Unicode.GetBytes(s);
            return ret;
        }

Would this function produce a valid result (provided that the string is in unicode)? Thanx!

+1  A: 

Representing a string as a blob represented as a string is odd... any reason you can't just use the string directly?

The string is always unicode; it is the encoded bytes that change. Since base-64 is always <128, using unicode in the last part seems overkill (unless that is what the wire-format demands). Personally, I'd use UTF8 or ASCII for the last GetBytes so that each base-64 character only takes one byte.

Marc Gravell
Yes, it is odd. The reason I'm doing it us because I'm making calls into an API of an old legacy system that for some reason want the strings to be passed as base64 byte arrays.
Clean
A: 

All strings in .NET are unicode. This code will produce valid result but the consumer of the BASE64 string should also be unicode enabled.

Darin Dimitrov
A: 

Yes, it would output a base64-encoded string of the UTF-16 little-endian representation of your source string. Keep in mind that, AFAIK, it's not really common to use UTF-16 in base64, ASCII or UTF-8 is normally used. However, the important thing here is that the sender and the receiver agree on which encoding must be used.

I don't understand why you reconvert the base64 string in array of bytes: base64 is used to avoid encoding incompatibilities when transmitting, so you should keep is as a string and output it in the format required by the protocol you use to transmit the data. And, as Marc said, it's definitely overkill to use UTF-16 for that purpose, since base64 includes only 64 characters, all under 128.

Matteo Italia
+1  A: 

Looks okay, although the approach is strange. But use Encoding.ASCII.GetBytes() to convert the base64 string to byte[]. Base64 encoding only contains ASCII characters. Using Unicode gets you an extra 0 byte for each character.

Hans Passant
Thanx! I'll follow your advice and use Encoding.ASCII.GetBytes() instead.
Clean