using System; class MainClass { public static void Main() { int [] LargeArray; try { LargeArray = new int [2000000000]; } catch(OutOfMemoryException) { Console.WriteLine("The CLR is out of memory."); } } }
Throw and Catch an IO exception because the file zxcvb.data doesn't exist
using System.IO; public class IoError { public static void Main() { StreamReader f; try{ f = new StreamReader("DoesNotExist.data"); }catch(IOException e) { System.Console.WriteLine(e); } f = new StreamReader("DoesNotExist.data"); } }
Convert byte array to Int32
using System; using System.IO; class MainClass { public static byte[] DecimalToByteArray (decimal src){ using (MemoryStream stream = new MemoryStream()) { using (BinaryWriter writer = new BinaryWriter(stream)){ writer.Write(src); return stream.ToArray(); } } } public static decimal ByteArrayToDecimal (byte[] src){ using (MemoryStream stream = new MemoryStream(src)){ using (BinaryReader reader = new BinaryReader(stream)){ return reader.ReadDecimal(); } } } public static void Main() { byte[] b = null; b = BitConverter.GetBytes(true); Console.WriteLine(BitConverter.ToString(b)); Console.WriteLine(BitConverter.ToBoolean(b, 0)); b = BitConverter.GetBytes(3678); Console.WriteLine(BitConverter.ToString(b)); Console.WriteLine(BitConverter.ToInt32(b, 0)); b = DecimalToByteArray(285998345545.563846696m); Console.WriteLine(BitConverter.ToString(b)); Console.WriteLine(ByteArrayToDecimal(b)); } }
Convert byte array to String with BitConverter
using System; using System.IO; using System.Text; class MainClass { public static void Main() { using (StreamWriter output = new StreamWriter("output.txt")) { string srcString = "Area = u03A0r^2"; output.WriteLine("Source Text : " + srcString); byte[] utf16String = Encoding.Unicode.GetBytes(srcString); output.WriteLine("UTF-16 Bytes: {0}",BitConverter.ToString(utf16String)); byte[] utf8String = Encoding.UTF8.GetBytes(srcString); byte[] asciiString = Encoding.ASCII.GetBytes(srcString); output.WriteLine("UTF-8 Bytes: {0}", BitConverter.ToString(utf8String)); output.WriteLine("ASCII Bytes: {0}", BitConverter.ToString(asciiString)); output.WriteLine("UTF-8 Text : {0}",Encoding.UTF8.GetString(utf8String)); output.WriteLine("ASCII Text : {0}",Encoding.ASCII.GetString(asciiString)); } } }
Decodes all or part of the input base64 encoded StringBuffer
/******************************************************************************
* The MIT License
* Copyright (c) 2003 Novell Inc. www.novell.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the Software), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*******************************************************************************/
//
// Novell.Directory.Ldap.Utilclass.Base64.cs
//
// Author:
// Sunil Kumar (Sunilk@novell.com)
//
// (C) 2003 Novell, Inc (http://www.novell.com)
//
using System;
namespace Novell.Directory.Ldap.Utilclass
{
///
///
/// The Base64 Content-Transfer-Encoding is designed to represent
/// arbitrary sequences of octets in a form that need not be humanly
/// readable. The encoding and decoding algorithms are simple, but the
/// encoded data are consistently only about 33 percent larger than the
/// unencoded data. The base64 encoding algorithm is defined by
/// RFC 2045.
///
public class Base64
{
///
/// Decodes all or part of the input base64 encoded StringBuffer, each
/// Character value representing a base64 character. The resulting
/// binary data is returned as an array of bytes.
///
///
/// The StringBuffer object that contains base64
/// encoded data.
///
/// The start index of the base64 encoded data.
///
/// The end index + 1 of the base64 encoded data.
///
///
///
///
public static sbyte[] decode(System.Text.StringBuilder encodedSBuf, int start, int end)
{
///
///
/// dmap is a base64 (8-bit) to six-bit value converstion table.
/// For example the ASCII character 'P' has a value of 80.
/// The value in the 80th position of the table is 0x0f or 15.
/// 15 is the original 6-bit value that the letter 'P' represents.
///
/*
* 6-bit decoded value base64 base64
* encoded character
* value
*
* Note: about half of the values in the table are only place holders
*/
sbyte[] dmap = new sbyte[]{(sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x3e), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x3f), (sbyte) (0x34), (sbyte) (0x35), (sbyte) (0x36), (sbyte) (0x37), (sbyte) (0x38), (sbyte) (0x39), (sbyte) (0x3a), (sbyte) (0x3b), (sbyte) (0x3c), (sbyte) (0x3d), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x01), (sbyte) (0x02), (sbyte) (0x03), (sbyte) (0x04), (sbyte) (0x05), (sbyte) (0x06), (sbyte) (0x07), (sbyte) (0x08), (sbyte) (0x09), (sbyte) (0x0a), (sbyte) (0x0b), (sbyte) (0x0c), (sbyte) (0x0d), (sbyte) (0x0e), (sbyte) (0x0f), (sbyte) (0x10), (sbyte) (0x11), (sbyte) (0x12), (sbyte) (0x13), (sbyte) (0x14), (sbyte) (0x15), (sbyte) (0x16), (sbyte) (0x17), (sbyte) (0x18), (sbyte) (0x19), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x1a), (sbyte) (0x1b), (sbyte) (0x1c), (sbyte) (0x1d), (sbyte) (0x1e), (sbyte) (0x1f), (sbyte) (0x20), (sbyte) (0x21), (sbyte) (0x22), (sbyte) (0x23), (sbyte) (0x24), (sbyte) (0x25), (sbyte) (0x26), (sbyte) (0x27), (sbyte) (0x28), (sbyte) (0x29), (sbyte) (0x2a), (sbyte) (0x2b), (sbyte) (0x2c), (sbyte) (0x2d), (sbyte) (0x2e), (sbyte) (0x2f), (sbyte) (0x30), (sbyte) (0x31), (sbyte) (0x32), (sbyte) (0x33), (sbyte) (0x00), (
sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00)}; // 120-127 'xyz '
int i, j, k;
int esbLen = end – start; // length of the encoded part
int gn = esbLen / 4; // number of four-bytes group in ebs
int dByteLen; // length of dbs, default is '0'
bool onePad = false, twoPads = false;
sbyte[] decodedBytes; // decoded bytes
if (encodedSBuf.Length == 0)
{
return new sbyte[0];
}
// the number of encoded bytes should be multiple of number 4
if ((esbLen % 4) != 0)
{
throw new System.SystemException(“Novell.Directory.Ldap.ldif_dsml.” + “Base64Decoder: decode error: mal-formatted encode value”);
}
// every four-bytes in ebs, except the last one if it in the form of
// three bytes.
if ((encodedSBuf[end – 1] == (int)'=') && (encodedSBuf[end – 2] == (int)'='))
{
// the last four bytes of ebs is in the form of '**=='
twoPads = true;
// the first two bytes of the last four-bytes of ebs will be
// decoded into one byte.
dByteLen = gn * 3 – 2;
decodedBytes = new sbyte[dByteLen];
}
else if (encodedSBuf[end – 1] == (int)'=')
{
// the last four bytes of ebs is in the form of '***='
onePad = true;
// the first two bytes of the last four-bytes of ebs will be
// decoded into two bytes.
dByteLen = gn * 3 – 1;
decodedBytes = new sbyte[dByteLen];
}
else
{
// the last four bytes of ebs is in the form of '****', eg. no pad.
dByteLen = gn * 3;
decodedBytes = new sbyte[dByteLen];
}
// map of encoded and decoded bits
// no padding:
// bits in 4 encoded bytes: 76543210 76543210 76543210 76543210
// bits in 3 decoded bytes: 765432 107654 321076 543210
// base64 string “QUFB”:00010000 00010100 000001010 0000001
// plain string “AAA”: 010000 010100 000101 000001
// one padding:
// bits in 4 encoded bytes: 76543210 76543210 76543210 76543210
// bits in 2 decoded bytes: 765432 107654 3210
// base64 string “QUE=”: 00010000 000101000 0000100 00111101
// plain string “AA”: 010000 010100 0001
// two paddings:
// bits in 4 encoded bytes: 76543210 76543210 76543210 76543210
// bits in 1 decoded bytes: 765432 10
// base64 string “QQ==”: 00010000 00010000 00111101 00111101
// plain string “A”: 010000 01
for (i = 0, j = 0, k = 1; i < esbLen; i += 4, j += 3, k++)
{
// build decodedBytes[j].
decodedBytes[j] = (sbyte)(dmap[encodedSBuf[start + i]] << 2 | (dmap[encodedSBuf[start + i + 1]] & 0x30) >> 4);
// build decodedBytes[j+1]
if ((k == gn) && twoPads)
{
break;
}
else
{
decodedBytes[j + 1] = (sbyte)((dmap[encodedSBuf[start + i + 1]] & 0x0f) << 4 | (dmap[encodedSBuf[start + i + 2]] & 0x3c) >> 2);
}
// build decodedBytes[j+2]
if ((k == gn) && onePad)
{
break;
}
else
{
decodedBytes[j + 2] = (sbyte)((dmap[encodedSBuf[start + i + 2]] & 0x03) << 6 | dmap[encodedSBuf[start + i + 3]] & 0x3f);
}
}
return decodedBytes;
}
}
}
[/csharp]
The Base64 utility class performs base64 encoding and decoding. The resulting binary data is returned as an array of bytes.
/******************************************************************************
* The MIT License
* Copyright (c) 2003 Novell Inc. www.novell.com
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the Software), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*******************************************************************************/
//
// Novell.Directory.Ldap.Utilclass.Base64.cs
//
// Author:
// Sunil Kumar (Sunilk@novell.com)
//
// (C) 2003 Novell, Inc (http://www.novell.com)
//
using System;
namespace Novell.Directory.Ldap.Utilclass
{
///
///
/// The Base64 Content-Transfer-Encoding is designed to represent
/// arbitrary sequences of octets in a form that need not be humanly
/// readable. The encoding and decoding algorithms are simple, but the
/// encoded data are consistently only about 33 percent larger than the
/// unencoded data. The base64 encoding algorithm is defined by
/// RFC 2045.
///
public class Base64
{
///
/// The resulting binary data is returned as an array of bytes.
///
///
/// The character array containing the base64 encoded data.
///
///
///
///
[CLSCompliantAttribute(false)]
public static sbyte[] decode(char[] encodedChars)
{
///
///
/// dmap is a base64 (8-bit) to six-bit value converstion table.
/// For example the ASCII character 'P' has a value of 80.
/// The value in the 80th position of the table is 0x0f or 15.
/// 15 is the original 6-bit value that the letter 'P' represents.
///
/*
* 6-bit decoded value base64 base64
* encoded character
* value
*
* Note: about half of the values in the table are only place holders
*/
sbyte[] dmap = new sbyte[]{(sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x3e), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x3f), (sbyte) (0x34), (sbyte) (0x35), (sbyte) (0x36), (sbyte) (0x37), (sbyte) (0x38), (sbyte) (0x39), (sbyte) (0x3a), (sbyte) (0x3b), (sbyte) (0x3c), (sbyte) (0x3d), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x01), (sbyte) (0x02), (sbyte) (0x03), (sbyte) (0x04), (sbyte) (0x05), (sbyte) (0x06), (sbyte) (0x07), (sbyte) (0x08), (sbyte) (0x09), (sbyte) (0x0a), (sbyte) (0x0b), (sbyte) (0x0c), (sbyte) (0x0d), (sbyte) (0x0e), (sbyte) (0x0f), (sbyte) (0x10), (sbyte) (0x11), (sbyte) (0x12), (sbyte) (0x13), (sbyte) (0x14), (sbyte) (0x15), (sbyte) (0x16), (sbyte) (0x17), (sbyte) (0x18), (sbyte) (0x19), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x1a), (sbyte) (0x1b), (sbyte) (0x1c), (sbyte) (0x1d), (sbyte) (0x1e), (sbyte) (0x1f), (sbyte) (0x20), (sbyte) (0x21), (sbyte) (0x22), (sbyte) (0x23), (sbyte) (0x24), (sbyte) (0x25), (sbyte) (0x26), (sbyte) (0x27), (sbyte) (0x28), (sbyte) (0x29), (sbyte) (0x2a), (sbyte) (0x2b), (sbyte) (0x2c), (sbyte) (0x2d), (sbyte) (0x2e), (sbyte) (0x2f), (sbyte) (0x30), (sbyte) (0x31), (sbyte) (0x32), (sbyte) (0x33), (sbyte) (0x00), (
sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00), (sbyte) (0x00)}; // 120-127 'xyz '
int i, j, k;
int ecLen = encodedChars.Length; // length of encodedChars
int gn = ecLen / 4; // number of four-byte groups in encodedChars
int dByteLen; // length of decoded bytes, default is '0'
bool onePad = false, twoPads = false;
sbyte[] decodedBytes; // decoded bytes
if (encodedChars.Length == 0)
{
return new sbyte[0];
}
// the number of encoded bytes should be multiple of 4
if ((ecLen % 4) != 0)
{
throw new System.SystemException(“Novell.Directory.Ldap.ldif_dsml.” + “Base64Decoder: decode: mal-formatted encode value”);
}
// every four-bytes in encodedString, except the last one if it in the
// form of '**==' or '***=' ( can't be '*' or ''), will be
// decoded into three bytes.
if ((encodedChars[ecLen – 1] == (int) '=') && (encodedChars[ecLen – 2] == (int) '='))
{
// the last four bytes of encodedChars is in the form of '**=='
twoPads = true;
// the first two bytes of the last four-bytes of encodedChars will
// be decoded into one byte.
dByteLen = gn * 3 – 2;
decodedBytes = new sbyte[dByteLen];
}
else if (encodedChars[ecLen – 1] == '=')
{
// the last four bytes of encodedChars is in the form of '***='
onePad = true;
// the first two bytes of the last four-bytes of encodedChars will
// be decoded into two bytes.
dByteLen = gn * 3 – 1;
decodedBytes = new sbyte[dByteLen];
}
else
{
// the last four bytes of encodedChars is in the form of '****',
// e.g. no pad.
dByteLen = gn * 3;
decodedBytes = new sbyte[dByteLen];
}
// map of encoded and decoded bits
// no padding:
// bits in 4 encoded bytes: 76543210 76543210 76543210 76543210
// bits in 3 decoded bytes: 765432 107654 321076 543210
// base64 string “QUFB”:00010000 00010100 000001010 0000001
// plain string “AAA”: 010000 010100 000101 000001
// one padding:
// bits in 4 encoded bytes: 76543210 76543210 76543210 76543210
// bits in 2 decoded bytes: 765432 107654 3210
// base64 string “QUE=”: 00010000 000101000 0000100 00111101
// plain string “AA”: 010000 010100 0001
// two paddings:
// bits in 4 encoded bytes: 76543210 76543210 76543210 76543210
// bits in 1 decoded bytes: 765432 10
// base64 string “QQ==”: 00010000 00010000 00111101 00111101
// plain string “A”: 010000 01
for (i = 0, j = 0, k = 1; i < ecLen; i += 4, j += 3, k++)
{
// build decodedBytes[j].
decodedBytes[j] = (sbyte) (dmap[encodedChars[i]] << 2 | (dmap[encodedChars[i + 1]] & 0x30) >> 4);
// build decodedBytes[j+1]
if ((k == gn) && twoPads)
{
break;
}
else
{
decodedBytes[j + 1] = (sbyte) ((dmap[encodedChars[i + 1]] & 0x0f) << 4 | (dmap[encodedChars[i + 2]] & 0x3c) >> 2);
}
// build decodedBytes[j+2]
if ((k == gn) && onePad)
{
break;
}
else
{
decodedBytes[j + 2] = (sbyte) ((dmap[encodedChars[i + 2]] & 0x03) << 6 | dmap[encodedChars[i + 3]] & 0x3f);
}
}
return decodedBytes;
}
}
}
[/csharp]
The Base64 utility class performs base64 encoding and decoding.
/****************************************************************************** * The MIT License * Copyright (c) 2003 Novell Inc. www.novell.com * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the Software), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. *******************************************************************************/ // // Novell.Directory.Ldap.Utilclass.Base64.cs // // Author: // Sunil Kumar (Sunilk@novell.com) // // (C) 2003 Novell, Inc (http://www.novell.com) // using System; namespace Novell.Directory.Ldap.Utilclass { /// <summary> The Base64 utility class performs base64 encoding and decoding. /// /// The Base64 Content-Transfer-Encoding is designed to represent /// arbitrary sequences of octets in a form that need not be humanly /// readable. The encoding and decoding algorithms are simple, but the /// encoded data are consistently only about 33 percent larger than the /// unencoded data. The base64 encoding algorithm is defined by /// RFC 2045. /// </summary> public class Base64 { /// <summary> Encodes the specified bytes into a base64 array of bytes. /// Each byte in the return array represents a base64 character. /// /// </summary> /// <param name="inputBytes"> the byte array to be encoded. /// /// </param> /// <returns> a String containing the base64 encoded data /// </returns> [CLSCompliantAttribute(false)] public static System.String encode(sbyte[] inputBytes) { /// <summary>Conversion table for encoding to base64. /// /// emap is a six-bit value to base64 (8-bit) converstion table. /// For example, the value of the 6-bit value 15 /// is mapped to 0x50 which is the ASCII letter 'P', i.e. the letter P /// is the base64 encoded character that represents the 6-bit value 15. /// </summary> /* * 8-bit base64 encoded character base64 6-bit * encoded original * character binary value */ char[] emap = new char[]{'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', '+', '/'}; // 4-9, + /; 56-63 int i, j, k; int t, t1, t2; int ntb; // number of three-bytes in inputBytes bool onePadding = false, twoPaddings = false; char[] encodedChars; // base64 encoded chars int len = inputBytes.Length; if (len == 0) { // No data, return no data. return new System.Text.StringBuilder("").ToString(); } // every three bytes will be encoded into four bytes if (len % 3 == 0) { ntb = len / 3; } // the last one or two bytes will be encoded into // four bytes with one or two paddings else { ntb = len / 3 + 1; } // need two paddings if ((len % 3) == 1) { twoPaddings = true; } // need one padding else if ((len % 3) == 2) { onePadding = true; } encodedChars = new char[ntb * 4]; // map of decoded and encoded bits // bits in 3 decoded bytes: 765432 107654 321076 543210 // bits in 4 encoded bytes: 76543210765432107654321076543210 // plain "AAA": 010000 010100 000101 000001 // base64 encoded "QUFB": 00010000000101000000010100000001 // one padding: // bits in 2 decoded bytes: 765432 10 7654 3210 // bits in 4 encoded bytes: 765432107654 321076543210 '=' // plain "AA": 010000 010100 0001 // base64 encoded "QUE=": 00010000000101000000010000111101 // two paddings: // bits in 1 decoded bytes: 765432 10 // bits in 4 encoded bytes: 7654321076543210 '=' '=' // plain "A": 010000 01 // base64 encoded "QQ==": 00010000000100000011110100111101 // // note: the encoded bits which have no corresponding decoded bits // are filled with zeros; '=' = 00111101. for (i = 0, j = 0, k = 1; i < len; i += 3, j += 4, k++) { // build encodedChars[j] t = 0x00ff & inputBytes[i]; encodedChars[j] = emap[t >> 2]; // build encodedChars[j+1] if ((k == ntb) && twoPaddings) { encodedChars[j + 1] = emap[(t & 0x03) << 4]; encodedChars[j + 2] = '='; encodedChars[j + 3] = '='; break; } else { t1 = 0x00ff & inputBytes[i + 1]; encodedChars[j + 1] = emap[((t & 0x03) << 4) + ((t1 & 0xf0) >> 4)]; } // build encodedChars[j+2] if ((k == ntb) && onePadding) { encodedChars[j + 2] = emap[(t1 & 0x0f) << 2]; encodedChars[j + 3] = '='; break; } else { t2 = 0x00ff & inputBytes[i + 2]; encodedChars[j + 2] = (emap[(t1 & 0x0f) << 2 | (t2 & 0xc0) >> 6]); } // build encodedChars[j+3] encodedChars[j + 3] = (emap[(t2 & 0x3f)]); } return new System.String(encodedChars); } } }