I have a byte[] and I'm looking for the most efficient way to base64 encode it.

The problem is that the built in .Net method Convert.FromBase64CharArray requires a char[] as an input, and converting my byte[] to a char[] just to convert it again to a base64 encoded array seems pretty stupid.

Is there any more direct way to do it?

[[EDIT:]] I'll expaling what I want to acheive better - I have a byte[] and I need to return a new base64 encoded byte[]

5

8 Answers

Byte[] -> String: use system.convert.tobase64string

Convert.ToBase64String(byte[] data) 

String -> Byte[]: use system.convert.frombase64string

Convert.FromBase64String(string data) 
10

Base64 is a way to represent bytes in a textual form (as a string). So there is no such thing as a Base64 encoded byte[]. You'd have a base64 encoded string, which you could decode back to a byte[].

However, if you want to end up with a byte array, you could take the base64 encoded string and convert it to a byte array, like:

string base64String = Convert.ToBase64String(bytes); byte[] stringBytes = Encoding.ASCII.GetBytes(base64String); 

This, however, makes no sense because the best way to represent a byte[] as a byte[], is the byte[] itself :)

6

Here is the code to base64 encode directly to byte array (tested to be performing +-10% of .Net Implementation, but allocates half the memory):

 static public void testBase64EncodeToBuffer() { for (int i = 1; i < 200; ++i) { // prep test data byte[] testData = new byte[i]; for (int j = 0; j < i; ++j) testData[j] = (byte)(j ^ i); // test testBase64(testData); } } static void testBase64(byte[] data) { if (!appendBase64(data, 0, data.Length, false).SequenceEqual(System.Text.Encoding.ASCII.GetBytes(Convert.ToBase64String(data)))) throw new Exception("Base 64 encoding failed"); } static public byte[] appendBase64(byte[] data , int offset , int size , bool addLineBreaks = false) { byte[] buffer; int bufferPos = 0; int requiredSize = (4 * ((size + 2) / 3)); // size/76*2 for 2 line break characters if (addLineBreaks) requiredSize += requiredSize + (requiredSize / 38); buffer = new byte[requiredSize]; UInt32 octet_a; UInt32 octet_b; UInt32 octet_c; UInt32 triple; int lineCount = 0; int sizeMod = size - (size % 3); // adding all data triplets for (; offset < sizeMod;) { octet_a = data[offset++]; octet_b = data[offset++]; octet_c = data[offset++]; triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; buffer[bufferPos++] = base64EncodingTable[(triple >> 3 * 6) & 0x3F]; buffer[bufferPos++] = base64EncodingTable[(triple >> 2 * 6) & 0x3F]; buffer[bufferPos++] = base64EncodingTable[(triple >> 1 * 6) & 0x3F]; buffer[bufferPos++] = base64EncodingTable[(triple >> 0 * 6) & 0x3F]; if (addLineBreaks) { if (++lineCount == 19) { buffer[bufferPos++] = 13; buffer[bufferPos++] = 10; lineCount = 0; } } } // last bytes if (sizeMod < size) { octet_a = offset < size ? data[offset++] : (UInt32)0; octet_b = offset < size ? data[offset++] : (UInt32)0; octet_c = (UInt32)0; // last character is definitely padded triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; buffer[bufferPos++] = base64EncodingTable[(triple >> 3 * 6) & 0x3F]; buffer[bufferPos++] = base64EncodingTable[(triple >> 2 * 6) & 0x3F]; buffer[bufferPos++] = base64EncodingTable[(triple >> 1 * 6) & 0x3F]; buffer[bufferPos++] = base64EncodingTable[(triple >> 0 * 6) & 0x3F]; // add padding '=' sizeMod = size % 3; // last character is definitely padded buffer[bufferPos - 1] = (byte)'='; if (sizeMod == 1) buffer[bufferPos - 2] = (byte)'='; } return buffer; } 
3
byte[] base64EncodedStringBytes = Encoding.ASCII.GetBytes(Convert.ToBase64String(binaryData)) 

Based on your edit and comments.. would this be what you're after?

byte[] newByteArray = UTF8Encoding.UTF8.GetBytes(Convert.ToBase64String(currentByteArray)); 
1

You could use the String Convert.ToBase64String(byte[]) to encode the byte array into a base64 string, then Byte[] Convert.FromBase64String(string) to convert the resulting string back into a byte array.

To retrieve your image from byte to base64 string....

Model property:

 public byte[] NomineePhoto { get; set; } public string NomineePhoneInBase64Str { get { if (NomineePhoto == null) return ""; return $"data:image/png;base64,{Convert.ToBase64String(NomineePhoto)}"; } } 

IN view:

 <img src="@item.NomineePhoneInBase64Str" /> 
 public void ProcessRequest(HttpContext context) { string constring = ConfigurationManager.ConnectionStrings["SQL_Connection_String"].ConnectionString; SqlConnection conn = new SqlConnection(constring); conn.Open(); SqlCommand cmd = new SqlCommand("select image1 from TestGo where TestId=1", conn); SqlDataReader dr = cmd.ExecuteReader(); dr.Read(); MemoryStream str = new MemoryStream(); context.Response.Clear(); Byte[] bytes = (Byte[])dr[0]; string d = System.Text.Encoding.Default.GetString(bytes); byte[] bytes2 = Convert.FromBase64String(d); //context.Response.Write(d); Image img = Image.FromStream(new MemoryStream(bytes2)); img.Save(context.Response.OutputStream, ImageFormat.Png); context.Response.Flush(); str.WriteTo(context.Response.OutputStream); str.Dispose(); str.Close(); conn.Close(); context.Response.End(); } 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy