본문 바로가기

Programming/C#.NET

.NET C# Base64 Decode

갑자기 필요한 일이 생겨서 -_ -;;

CodeProject를 뒤져 있던 클래스를 함수로 변환해서 아래와 같이 이용하게 되었습니다 -ㅁ -..

저작권은 물론 코드프로젝트에 원 저작자에게 있구요 ㅎㅎ


원본은 http://www.codeproject.com/KB/cs/base64encdec.aspx 이건데요...


제가 아래처럼 코드를 좀 바꿔서 썼습니다 -ㅁ -


아참 사용법은


string a = "가나다";
 
Console.WriteLine(GetDecoded(a.ToCharArray()));
 

이런식으로 .ToCharArray()를 써서 보내주셔야 합니다 ^ ^


시간이 없어서 Encode 쪽 코드는 변환 안시켰어요;;

필요하시다면 코드프로젝트쪽의 소스를 보세요 ㅎㅎㅎ


        public string GetDecoded(char[] input)
        {
            char[] source;
            int length, length2, length3;
            int blockCount;
            int paddingCount;
 
            int temp = 0;
            source = input;
            length = input.Length;
 
            //find how many padding are there
            for (int x = 0; x < 2; x++)
            {
                if (input[length - x - 1] == '=')
                    temp++;
            }
            paddingCount = temp;
            //calculate the blockCount;
            //assuming all whitespace and carriage returns/newline were removed.
            blockCount = length / 4;
            length2 = blockCount * 3;
 
 
            byte[] buffer = new byte[length];//first conversion result
            byte[] buffer2 = new byte[length2];//decoded array with padding
 
            for (int x = 0; x < length; x++)
            {
                buffer[x] = char2sixbit(source[x]);
            }
 
            byte b, b1, b2, b3;
            byte temp1, temp2, temp3, temp4;
 
            for (int x = 0; x < blockCount; x++)
            {
                temp1 = buffer[x * 4];
                temp2 = buffer[x * 4 + 1];
                temp3 = buffer[x * 4 + 2];
                temp4 = buffer[x * 4 + 3];
 
                b = (byte)(temp1 << 2);
                b1 = (byte)((temp2 & 48) >> 4);
                b1 += b;
 
                b = (byte)((temp2 & 15) << 4);
                b2 = (byte)((temp3 & 60) >> 2);
                b2 += b;
 
                b = (byte)((temp3 & 3) << 6);
                b3 = temp4;
                b3 += b;
 
                buffer2[x * 3] = b1;
                buffer2[x * 3 + 1] = b2;
                buffer2[x * 3 + 2] = b3;
            }
            //remove paddings
            length3 = length2 - paddingCount;
            byte[] result = new byte[length3];
 
            for (int x = 0; x < length3; x++)
            {
                result[x] = buffer2[x];
            }
 
            StringBuilder sb = new StringBuilder();
            //byte[] temp=myDecoder.GetDecoded();
            sb.Append(System.Text.UTF8Encoding.UTF8.GetChars(result));
 
            return sb.ToString();
        }
 
        private byte char2sixbit(char c)
        {
            char[] lookupTable = new char[64]
                    {    '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','+','/'};
            if (c == '=')
                return 0;
            else
            {
                for (int x = 0; x < 64; x++)
                {
                    if (lookupTable[x] == c)
                        return (byte)x;
                }
                //should not reach here
                return 0;
            }
        }
반응형