Пример #1
0
        /// <summary>
        /// Decodes a base64 data array
        /// </summary>
        /// <param name="data">The base64 data to decode</param>
        public override byte[] Decode(byte[] data)
        {
            if (m_Padding != null)
            {
                int paddingChar = (char)m_Padding;
                if ((paddingChar < 0) || (paddingChar > 127))
                {
                    throw new ArgumentException(string.Format("Invalid padding character!"), nameof(m_Padding));
                }
            }
            //decode data
            List <byte> result = new List <byte>(data.Length);
            int         value  = 0;
            int         bits   = 0;

            foreach (byte b in data)
            {
                if (b == m_Padding)
                {
                    break;
                }

                value <<= BitCount;
                bits   += BitCount;
                value  |= CharacterDictionary.GetValue((char)b);
                if (bits >= 8)
                {
                    bits -= 8;
                    int l_Out = value >> bits;
                    value = value & ~(0xFFFF << bits);
                    result.Add((byte)l_Out);
                }
            }
            return(result.ToArray());
        }
Пример #2
0
        /// <summary>Decodes a Base32 data array.</summary>
        /// <param name="data">The Base32 data to decode.</param>
        public override byte[] Decode(byte[] data)
        {
            if (CharacterDictionary == null)
            {
                throw new InvalidOperationException($"Property {nameof(CharacterDictionary)} has to be set!");
            }

            if (data == null)
            {
                throw new ArgumentNullException(nameof(data));
            }

            if (Padding != null)
            {
                int paddingChar = (char)Padding;
                if (paddingChar is < 0 or > 127)
                {
                    throw new InvalidOperationException("Invalid padding character!");
                }
            }

            // decode data
            var result = new List <byte>(data.Length);
            var value  = 0;
            var bits   = 0;

            foreach (var b in data)
            {
                if (b == Padding)
                {
                    break;
                }

                value <<= bitCount;
                bits   += bitCount;
                value  |= CharacterDictionary.GetValue((char)b);
                if (bits >= 8)
                {
                    bits -= 8;
                    var outValue = value >> bits;
                    value &= ~(0xFFFF << bits);
                    result.Add((byte)outValue);
                }
            }

            return(result.ToArray());
        }