base64 문자열을 어떻게 인코딩하고 디코딩합니까?


885
  1. 문자열이 주어진 base64 인코딩 문자열을 어떻게 반환합니까?

  2. base64로 인코딩 된 문자열을 문자열로 어떻게 디코딩합니까?


4
이것이 "지식 공유"질문과 답변이라면, 우리는 좀 더 깊이있는 것을 찾고 있다고 생각합니다. 또한 SO에 대한 빠른 검색이 나타납니다. stackoverflow.com/a/7368168/419
Kev

1
@Gnark 모든 문자열은 특정 기본 비트 인코딩 스키마로 인코딩됩니다. ASCII, UTF7, UTF8, ...이어야합니다. 제기 된 문제는 기껏해야 불완전합니다.
Lorenz Lo Sauer

2
당신이 정말로 이것을해야하는지 스스로에게 물어보십시오. base64는 주로 이진 데이터를 ASCII로 나타내거나 데이터베이스의 char 필드에 저장하거나 전자 메일을 통해 보낼 수 있습니다 (새 줄을 삽입 할 수 있음). 문자 데이터를 가져 와서 바이트로 변환 한 다음 다시 문자 데이터로 변환 하시겠습니까? 이번에는 읽을 수 없으며 원래 인코딩이 무엇인지 암시하지 않습니까?
bbsimonbb

원래 인코딩에 관심을 가져야하는 이유는 무엇입니까? UTF8 표현을 사용하여 문자열을 바이트로 인코딩합니다. 가능한 모든 문자열 문자를 나타낼 수 있습니다. 그런 다음 해당 데이터를 직렬화하고 다른 쪽에서는 해당 데이터를 직렬화 해제하고 원래와 동일한 문자열을 재구성합니다 (문자열 개체는 사용 된 인코딩에 대한 정보를 보유하지 않습니다). 그렇다면 사용 된 인코딩과 관련하여 왜 우려가 있습니까? 우리는 직렬화 된 데이터를 나타내는 독점적 인 방법으로 간주 할 수 있습니다. 어쨌든 관심이 없어야합니다.
Mladen B.

답변:


1666

인코딩

public static string Base64Encode(string plainText) {
  var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
  return System.Convert.ToBase64String(plainTextBytes);
}

풀다

public static string Base64Decode(string base64EncodedData) {
  var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
  return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}

41
입력 두 기능의 문자열과 솔루션에 대한 널 검사 완벽 :)입니다
Sverrir Sigmundarson

22
@SverrirSigmundarson : 또는 확장 방법으로 만듭니다.
TJ Crowder

73
@SverrirSigmundarson-왜 null 검사를합니까? 그는 입력 문자열을 참조하는 사람이 아닙니다. 널 검사는 NullReferenceException다른 사람이 아닌 자신의 코드에서 방지해야합니다 .
ken

16
@ken 그리고 다른 누군가는 "다른 사람이 아닌 자신의 코드에만 오류를 노출시켜야한다"고 말하고, "최초의 실패"와 "적절한 캡슐화"로 꾸며진 가장 놀랍지 않은 원칙을 불러 일으킨다. 때때로 이것은 하위 레벨 구성 요소의 오류를 랩핑하는 것을 의미합니다. 이 경우 deref 오류를 줄 바꿈하는 것은 확실히 모호하다는 데 동의합니다 (또한 개념으로서 null이 시작하는 데 약간의 해킹이라는 사실에 느리게 동의하지만 여전히 일부 효과를 볼 수 있습니다) 그렇지 않으면, 예외에 지정된 매개 변수 이름이 선택되지 않은 경우 올바르지 않을 수 있습니다.
tne

6
return System.Text.Encoding.UTF8.GetString (base64EncodedBytes, 0, base64EncodedBytes.Length); Windows Phone 8
steveen zoleko

46

몇 가지 깔끔한 기능으로 구현을 공유하고 있습니다.

  • 인코딩 클래스에 확장 메소드를 사용합니다. 이론상 누군가는 다른 유형의 인코딩 (UTF8뿐만 아니라)을 지원해야 할 수도 있습니다.
  • 또 다른 개선 사항은 null 입력에 대한 null 결과로 정상적으로 실패하는 것입니다. 실제 시나리오에서 매우 유용하며 X = decode (encode (X))에 해당하는 기능을 지원합니다.

비고 : 그건 당신이 확장 메서드를 사용하는 것을 기억 해야한다 (!)와 네임 스페이스를 가져옵니다 using(이 경우 키워드 using MyApplication.Helpers.Encoding).

암호:

namespace MyApplication.Helpers.Encoding
{
    public static class EncodingForBase64
    {
        public static string EncodeBase64(this System.Text.Encoding encoding, string text)
        {
            if (text == null)
            {
                return null;
            }

            byte[] textAsBytes = encoding.GetBytes(text);
            return System.Convert.ToBase64String(textAsBytes);
        }

        public static string DecodeBase64(this System.Text.Encoding encoding, string encodedText)
        {
            if (encodedText == null)
            {
                return null;
            }

            byte[] textAsBytes = System.Convert.FromBase64String(encodedText);
            return encoding.GetString(textAsBytes);
        }
    }
}

사용 예 :

using MyApplication.Helpers.Encoding; // !!!

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Test1();
            Test2();
        }

        static void Test1()
        {
            string textEncoded = System.Text.Encoding.UTF8.EncodeBase64("test1...");
            System.Diagnostics.Debug.Assert(textEncoded == "dGVzdDEuLi4=");

            string textDecoded = System.Text.Encoding.UTF8.DecodeBase64(textEncoded);
            System.Diagnostics.Debug.Assert(textDecoded == "test1...");
        }

        static void Test2()
        {
            string textEncoded = System.Text.Encoding.UTF8.EncodeBase64(null);
            System.Diagnostics.Debug.Assert(textEncoded == null);

            string textDecoded = System.Text.Encoding.UTF8.DecodeBase64(textEncoded);
            System.Diagnostics.Debug.Assert(textDecoded == null);
        }
    }
}

5
null경우에 돌아 오는 null것은 매우 일관된 행동입니다. 문자열로 작동하는 다른 .net API는 그렇게하지 않습니다.
t3chb0t

4
@ t3chb0t 필요에 따라 자유롭게 조정하십시오. 여기에 제시된 방식이 우리의 방식으로 조정되었습니다. 이것은 공개 API가 아닙니다.)
andrew.fox

1
이제 통신에서 상대방에게 base64로 인코딩 된 데이터를 보내는 2 개의 변수를 보내지 않아도됩니까? 사용 된 인코딩과 실제 base64 데이터를 모두 보내야합니까? 같은 인코딩을 사용하기 위해 양쪽에 규칙을 사용하면 쉽지 않습니까? 그렇게하면 base64 데이터 만 보내면됩니다.
Mladen B.

38

Andrew Fox와 Cebe의 답변에 따라 Base64String 확장 대신 문자열 확장을 사용했습니다.

public static class StringExtensions
{
    public static string ToBase64(this string text)
    {
        return ToBase64(text, Encoding.UTF8);
    }

    public static string ToBase64(this string text, Encoding encoding)
    {
        if (string.IsNullOrEmpty(text))
        {
            return text;
        }

        byte[] textAsBytes = encoding.GetBytes(text);
        return Convert.ToBase64String(textAsBytes);
    }

    public static bool TryParseBase64(this string text, out string decodedText)
    {
        return TryParseBase64(text, Encoding.UTF8, out decodedText);
    }

    public static bool TryParseBase64(this string text, Encoding encoding, out string decodedText)
    {
        if (string.IsNullOrEmpty(text))
        {
            decodedText = text;
            return false;
        }

        try
        {
            byte[] textAsBytes = Convert.FromBase64String(text);
            decodedText = encoding.GetString(textAsBytes);
            return true;
        }
        catch (Exception)
        {
            decodedText = null;
            return false;
        }
    }
}

1
필요한 경우 예외를 채우고 ParseBase64 (이 문자열 텍스트, 인코딩 인코딩, 문자열 decodedText)를 추가하고 TryParseBase64
João Antunes

22

디코딩 할 문자열이 올바른 base64로 인코딩 된 문자열이 아니기 때문에 andrew.fox의 약간의 변형입니다.

using System;

namespace Service.Support
{
    public static class Base64
    {
        public static string ToBase64(this System.Text.Encoding encoding, string text)
        {
            if (text == null)
            {
                return null;
            }

            byte[] textAsBytes = encoding.GetBytes(text);
            return Convert.ToBase64String(textAsBytes);
        }

        public static bool TryParseBase64(this System.Text.Encoding encoding, string encodedText, out string decodedText)
        {
            if (encodedText == null)
            {
                decodedText = null;
                return false;
            }

            try
            {
                byte[] textAsBytes = Convert.FromBase64String(encodedText);
                decodedText = encoding.GetString(textAsBytes);
                return true;
            }
            catch (Exception)
            {
                decodedText = null;
                return false;   
            }
        }
    }
}

13

아래 루틴을 사용하여 문자열을 base64 형식으로 변환 할 수 있습니다

public static string ToBase64(string s)
{
    byte[] buffer = System.Text.Encoding.Unicode.GetBytes(s);
    return System.Convert.ToBase64String(buffer);
}

또한 매우 유용한 온라인 도구 OnlineUtility.in 을 사용하여 base64 형식의 문자열을 인코딩 할 수 있습니다


온라인 도구는이 상황에서 도움이되지 않습니다. 그는 IT 코딩 방법을 요구하고 있습니다. OP가 온라인 도구를 요청하지 않았기 때문에 사람들이 "이 온라인 도구를 확인하십시오!"라고 말하는 이유가 종종 궁금합니다. D
Momoro

9
    using System;
    using System.Text;

    public static class Base64Conversions
    {
        public static string EncodeBase64(this string text, Encoding encoding = null)
        { 
            if (text == null) return null;

            encoding = encoding ?? Encoding.UTF8;
            var bytes = encoding.GetBytes(text);
            return Convert.ToBase64String(bytes);
        }

        public static string DecodeBase64(this string encodedText, Encoding encoding = null)
        {
            if (encodedText == null) return null;

            encoding = encoding ?? Encoding.UTF8;
            var bytes = Convert.FromBase64String(encodedText);
            return encoding.GetString(bytes);
        }
    }

용법

    var text = "Sample Text";
    var base64 = text.EncodeBase64();
    base64 = text.EncodeBase64(Encoding.UTF8); //or with Encoding

4

URL 안전 Base64 인코딩 / 디코딩

public static class Base64Url
{
    public static string Encode(string text)
    {
        return Convert.ToBase64String(Encoding.UTF8.GetBytes(text)).TrimEnd('=').Replace('+', '-')
            .Replace('/', '_');
    }

    public static string Decode(string text)
    {
        text = text.Replace('_', '/').Replace('-', '+');
        switch (text.Length % 4)
        {
            case 2:
                text += "==";
                break;
            case 3:
                text += "=";
                break;
        }
        return Encoding.UTF8.GetString(Convert.FromBase64String(text));
    }
}

1
URL 인코딩에 관한 질문은 아니지만 여전히 도움이됩니다 ..
Momoro

으악, 잘못된 질문에 게시했습니다
juliushuck

문제 없습니다. URL 인코딩 / 디코딩 방법을 보는 것이 여전히 흥미 롭습니다.
Momoro

3

다음과 같이 표시 할 수 있습니다.

var strOriginal = richTextBox1.Text;

byte[] byt = System.Text.Encoding.ASCII.GetBytes(strOriginal);

// convert the byte array to a Base64 string
string strModified = Convert.ToBase64String(byt);

richTextBox1.Text = "" + strModified;

이제 다시 변환합니다.

var base64EncodedBytes = System.Convert.FromBase64String(richTextBox1.Text);

richTextBox1.Text = "" + System.Text.Encoding.ASCII.GetString(base64EncodedBytes);
MessageBox.Show("Done Converting! (ASCII from base64)");

이게 도움이 되길 바란다!


1

개별 base64 숫자를 단순히 인코딩 / 디코딩하려는 경우 :

public static int DecodeBase64Digit(char digit, string digit62 = "+-.~", string digit63 = "/_,")
{
    if (digit >= 'A' && digit <= 'Z') return digit - 'A';
    if (digit >= 'a' && digit <= 'z') return digit + (26 - 'a');
    if (digit >= '0' && digit <= '9') return digit + (52 - '0');
    if (digit62.IndexOf(digit) > -1)  return 62;
    if (digit63.IndexOf(digit) > -1)  return 63;
    return -1;
}

public static char EncodeBase64Digit(int digit, char digit62 = '+', char digit63 = '/')
{
    digit &= 63;
    if (digit < 52)
        return (char)(digit < 26 ? digit + 'A' : digit + ('a' - 26));
    else if (digit < 62)
        return (char)(digit + ('0' - 52));
    else
        return digit == 62 ? digit62 : digit63;
}

숫자 62와 63에 사용할 항목에 대해 동의하지 않는 Base64 에는 다양한 버전 이 있으므로 DecodeBase64Digit이들 중 몇 가지를 허용 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.