[Mono-list] Convert Base64 to String

Steven Bell sfbell at keasdesign.net
Thu Mar 23 23:51:24 EST 2006


Thanks Paul and Arx.

I will try both your suggestions. Funny thing hit me a little while ago. 
The same code is running on a Fedora Core 4 system, with an older 
version of Mono, and working. The main difference is that on the system 
that did not decode the data, I was calling a web service via it's test 
form. On the working machine, the web service is being called by an 
actual client.

I am going to have to check up on versions etc...

Thanks again.

Paul Oremland wrote:
> I found an example on copdeproject once on how to decode base64 
> strings. Here's the class I wrote using that logic and an example on 
> how to decode base64 with that class.
>
> Here's the Base64 decoder class:
>
>         public class Base64Decoder
>         {
>                 char[] source;
>                 int length, length2, length3;
>                 int blockCount;
>                 int paddingCount;
>                 public Base64Decoder(char[] input)
>                 {
>                         int temp=0;
>                         source=input;
>                         length=input.Length;
>
>                         //find how many padding are there
>                         for (int x=0;x<2;x++)
>                         {
>                                 if(input[length-x-1]=='=')
>                                         temp++;
>                         }
>                         paddingCount=temp;
>                         //calculate the blockCount;
>                         //assuming all whitespace and carriage 
> returns/newline were removed.
>                         blockCount=length/4;
>                         length2=blockCount*3;
>                 }
>
>                 public byte[] GetDecoded()
>                 {
>                         byte[] buffer=new byte[length];//first 
> conversion result
>                         byte[] buffer2=new byte[length2];//decoded 
> array with padding
>
>                         for(int x=0;x<length;x++)
>                         {
>                                 buffer[x]=char2sixbit(source[x]);
>                         }
>
>                         byte b, b1,b2,b3;
>                         byte temp1, temp2, temp3, temp4;
>
>                         for(int x=0;x<blockCount;x++)
>                         {
>                                 temp1=buffer[x*4];
>                                 temp2=buffer[x*4+1];
>                                 temp3=buffer[x*4+2];
>                                 temp4=buffer[x*4+3];
>
>                                 b=(byte)(temp1<<2);
>                                 b1=(byte)((temp2 & 48)>>4);
>                                 b1+=b;
>
>                                 b=(byte)((temp2 & 15)<<4);
>                                 b2=(byte)((temp3 & 60)>>2);
>                                 b2+=b;
>
>                                 b=(byte)((temp3 & 3)<<6);
>                                 b3=temp4;
>                                 b3+=b;
>
>                                 buffer2[x*3]=b1;
>                                 buffer2[x*3+1]=b2;
>                                 buffer2[x*3+2]=b3;
>                         }
>                         //remove paddings
>                         length3=length2-paddingCount;
>                         byte[] result=new byte[length3];
>
>                         for(int x=0;x<length3;x++)
>                         {
>                                 result[x]=buffer2[x];
>                         }
>
>                         return result;
>                 }
>
>                 private byte char2sixbit(char c)
>                 {
>                         char[] lookupTable=new char[64]
>                                         { 
> 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 
>
>
> 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z', 
>
>
> '0','1','2','3','4','5','6','7','8','9','+','/'};
>                         if(c=='=')
>                                 return 0;
>                         else
>                         {
>                                 for (int x=0;x<64;x++)
>                                 {
>                                         if (lookupTable[x]==c)
>                                                 return (byte)x;
>                                 }
>                                 //should not reach here
>                                 return 0;
>                         }
>
>                 }
>
>         }
>
>
>
>
> using that class you can decode a base 64 string like:
>
> string base64StringToDecode = "SOME BASE64 STRING";
> char[] data = base64StringToDecode.ToCharArray();
> Base64Decoder myDecoder = new Base64Decoder(data);
> StringBuilder sb=new StringBuilder();
> byte[] temp = myDecoder.GetDecoded();
> sb.Append(UTF8Encoding.UTF8.GetChars(temp));
> string decodedString = sb.ToString();
>
>
> Hope that helps.....
>
>


More information about the Mono-list mailing list