Ejemplo n.º 1
0
        //---------------------------------------------------------------------
        // 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());
        }