123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- // This code is derived from jcifs smb client library <jcifs at samba dot org>
- // Ported by J. Arturo <webmaster at komodosoft dot net>
- //
- // This library is free software; you can redistribute it and/or
- // modify it under the terms of the GNU Lesser General Public
- // License as published by the Free Software Foundation; either
- // version 2.1 of the License, or (at your option) any later version.
- //
- // This library is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- // Lesser General Public License for more details.
- //
- // You should have received a copy of the GNU Lesser General Public
- // License along with this library; if not, write to the Free Software
- // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- using System;
- using System.Text;
- namespace SharpCifs.Util
- {
- public class Base64
- {
- private static readonly string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- /// <summary>Base-64 encodes the supplied block of data.</summary>
- /// <remarks>
- /// Base-64 encodes the supplied block of data. Line wrapping is not
- /// applied on output.
- /// </remarks>
- /// <param name="bytes">The block of data that is to be Base-64 encoded.</param>
- /// <returns>A <code>String</code> containing the encoded data.</returns>
- public static string Encode(byte[] bytes)
- {
- int length = bytes.Length;
- if (length == 0)
- {
- return string.Empty;
- }
- StringBuilder buffer = new StringBuilder((int)Math.Ceiling(length / 3d) * 4);
- int remainder = length % 3;
- length -= remainder;
- int block;
- int i = 0;
- while (i < length)
- {
- block = ((bytes[i++] & unchecked(0xff)) << 16) | ((bytes[i++] & unchecked(
- 0xff)) << 8) | (bytes[i++] & unchecked(0xff));
- buffer.Append(Alphabet[(int)(((uint)block) >> 18)]);
- buffer.Append(Alphabet[((int)(((uint)block) >> 12)) & unchecked(0x3f)]);
- buffer.Append(Alphabet[((int)(((uint)block) >> 6)) & unchecked(0x3f)]);
- buffer.Append(Alphabet[block & unchecked(0x3f)]);
- }
- if (remainder == 0)
- {
- return buffer.ToString();
- }
- if (remainder == 1)
- {
- block = (bytes[i] & unchecked(0xff)) << 4;
- buffer.Append(Alphabet[(int)(((uint)block) >> 6)]);
- buffer.Append(Alphabet[block & unchecked(0x3f)]);
- buffer.Append("==");
- return buffer.ToString();
- }
- block = (((bytes[i++] & unchecked(0xff)) << 8) | ((bytes[i]) & unchecked(0xff))) << 2;
- buffer.Append(Alphabet[(int)(((uint)block) >> 12)]);
- buffer.Append(Alphabet[((int)(((uint)block) >> 6)) & unchecked(0x3f)]);
- buffer.Append(Alphabet[block & unchecked(0x3f)]);
- buffer.Append("=");
- return buffer.ToString();
- }
- /// <summary>Decodes the supplied Base-64 encoded string.</summary>
- /// <remarks>Decodes the supplied Base-64 encoded string.</remarks>
- /// <param name="string">The Base-64 encoded string that is to be decoded.</param>
- /// <returns>A <code>byte[]</code> containing the decoded data block.</returns>
- public static byte[] Decode(string @string)
- {
- int length = @string.Length;
- if (length == 0)
- {
- return new byte[0];
- }
- int pad = (@string[length - 2] == '=') ? 2 : (@string[length - 1] == '=') ? 1 : 0;
- int size = length * 3 / 4 - pad;
- byte[] buffer = new byte[size];
- int block;
- int i = 0;
- int index = 0;
- while (i < length)
- {
- block = (Alphabet.IndexOf(@string[i++]) & unchecked(0xff)) << 18 | (Alphabet
- .IndexOf(@string[i++]) & unchecked(0xff)) << 12 | (Alphabet.IndexOf(@string
- [i++]) & unchecked(0xff)) << 6 | (Alphabet.IndexOf(@string[i++]) & unchecked(
- 0xff));
- buffer[index++] = unchecked((byte)((int)(((uint)block) >> 16)));
- if (index < size)
- {
- buffer[index++] = unchecked((byte)(((int)(((uint)block) >> 8)) & unchecked(0xff)));
- }
- if (index < size)
- {
- buffer[index++] = unchecked((byte)(block & unchecked(0xff)));
- }
- }
- return buffer;
- }
- }
- }
|