//--------------------------------------------------------------------- // public Static Methods //--------------------------------------------------------------------- public static string Encode(byte[] pBytes) { long buffer = 0; StringBuilder encoded = null; // Initializes encoded = new StringBuilder(); // loop for bytes for encoding for (int index = 0; index != pBytes.Length;) { // first move 5 bytes into a long buffer <<= 8; buffer |= ((long)pBytes[index] & 0x00000000000000FF); // check if we have 5 bytes already if (++index % 5 == 0) { encoded.Append(Base32.Map(((int)(buffer >> 35)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 30)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 25)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 20)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 15)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 10)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 5)) & 0x001F)); encoded.Append(Base32.Map(((int)buffer) & 0x001F)); // clear buffer buffer = 0; } } // check if the leftover bytes switch (pBytes.Length % 5) { case 1: buffer <<= 2; encoded.Append(Base32.Map(((int)(buffer >> 5)) & 0x001F)); encoded.Append(Base32.Map(((int)buffer) & 0x001F)); break; case 2: buffer <<= 4; encoded.Append(Base32.Map(((int)(buffer >> 15)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 10)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 5)) & 0x001F)); encoded.Append(Base32.Map(((int)buffer) & 0x001F)); break; case 3: buffer <<= 1; encoded.Append(Base32.Map(((int)(buffer >> 20)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 15)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 10)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 5)) & 0x001F)); encoded.Append(Base32.Map(((int)buffer) & 0x001F)); break; case 4: buffer <<= 3; encoded.Append(Base32.Map(((int)(buffer >> 30)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 25)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 20)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 15)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 10)) & 0x001F)); encoded.Append(Base32.Map(((int)(buffer >> 5)) & 0x001F)); encoded.Append(Base32.Map(((int)buffer) & 0x001F)); break; } return(encoded.ToString()); }