Come posso codificare e decodificare una stringa base64?


885
  1. Come posso restituire una stringa codificata in base64 con una stringa?

  2. Come decodificare una stringa codificata in base64 in una stringa?


4
Se questa è una domanda e una risposta "condivisione della conoscenza", penso che stiamo cercando qualcosa di più approfondito. Anche una rapida ricerca di SO si presenta: stackoverflow.com/a/7368168/419
Kev

1
@Gnark Qualsiasi stringa è codificata da un determinato schema di codifica bit sottostante. Sia ASCII, UTF7, UTF8, .... La domanda posta è nella migliore delle ipotesi incompleta.
Lorenz Lo Sauer,

2
Chiediti, hai davvero bisogno di farlo? Ricorda che base64 ha principalmente lo scopo di rappresentare i dati binari in ASCII, di archiviarli in un campo char in un database o di inviarli via e-mail (dove è possibile iniettare nuove righe). Vuoi davvero prendere i dati dei personaggi, convertirli in byte, quindi riconvertirli in dati dei personaggi, questa volta illeggibili e senza alcun accenno alla codifica originale?
bbsimonbb,

Perché dovremmo preoccuparci della codifica originale? Codifichiamo la stringa nei byte usando la rappresentazione UTF8, che può rappresentare tutti i possibili caratteri stringa. Quindi serializziamo quei dati e dall'altra parte deserializziamo quei dati e ricostruiamo la stessa stringa che avevamo originariamente (l'oggetto stringa non contiene comunque le informazioni sulla codifica utilizzata). Quindi perché c'è qualche preoccupazione relativa alla codifica utilizzata? Possiamo considerarlo come un modo proprietario di rappresentare i dati serializzati, a cui non dovremmo essere interessati in alcun modo.
Mladen B.

Risposte:


1668

Codificare

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

Decodificare

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

41
Null verifica le stringhe di input in entrambe le funzioni e la soluzione è perfetta :)
Sverrir Sigmundarson,

22
@SverrirSigmundarson: questo o renderli metodi di estensione.
TJ Crowder,

73
@SverrirSigmundarson - Perché eseguire un controllo null? Non è quello che dereferenzia la stringa di input. I controlli nulli dovrebbero impedire NullReferenceExceptionnel tuo codice, non in quello di qualcun altro.
Ken,

16
@ken E qualcun altro dirà "dovresti esporre solo errori nel tuo codice, non quello di qualcun altro", invocando il principio della minima sorpresa, speziato con "fail early" e "incapsulamento corretto". A volte questo significa correggere gli errori dei componenti di livello inferiore, a volte qualcos'altro. In questo caso, concordo sul fatto che il confezionamento di un errore deref sia sicuramente dubbio (inoltre stiamo tutti lentamente accettando il fatto che null come concetto è un po 'un trucco per cominciare), ma possiamo ancora vedere alcuni effetti in caso contrario: il nome del parametro indicato nell'eccezione potrebbe non essere corretto se non selezionato.
TNE

6
return System.Text.Encoding.UTF8.GetString (base64EncodedBytes, 0, base64EncodedBytes.Length); per windows phone 8
steveen zoleko

46

Condivido la mia implementazione con alcune funzionalità pulite:

  • utilizza metodi di estensione per la classe di codifica. La logica è che qualcuno potrebbe aver bisogno di supportare diversi tipi di codifica (non solo UTF8).
  • Un altro miglioramento sta fallendo con grazia con risultato nullo per l'inserimento nullo - è molto utile negli scenari di vita reale e supporta l'equivalenza per X = decodifica (codifica (X)).

Nota: Ricordate che per utilizzare il metodo di estensione si deve importare lo spazio dei nomi con (!) usingParola chiave (in questo caso using MyApplication.Helpers.Encoding).

Codice:

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);
        }
    }
}

Esempio di utilizzo:

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
Il ritorno nullin caso di nullè un comportamento molto incoerente. Nessun'altra API .net che funziona con le stringhe lo fa.
t3chb0t

4
@ t3chb0t sentiti libero di adattarlo alle tue esigenze. Poiché il modo in cui è presentato qui è stato adattato al nostro. Questa non è un'API pubblica;)
andrew.fox il

1
Non è necessario inviare 2 variabili all'interlocutore nella comunicazione (a cui si inviano i dati con codifica Base64)? Devi inviare sia la codifica utilizzata sia i dati base64 effettivi? Non è più facile se usi una convenzione su entrambi i lati per usare la stessa codifica? In questo modo dovresti solo inviare dati base64, giusto?
Mladen B.

38

Sulla base delle risposte di Andrew Fox e Cebe, l'ho capovolto e li ho trasformati in estensioni di stringa anziché in estensioni 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
Aggiungerei un ParseBase64 (questo testo di stringa, codifica di codifica, stringa decodificata di testo) (per popolare l'eccezione, se necessario, e lo chiamerei su TryParseBase64
João Antunes,

22

Una leggera variazione sulla risposta andrew.fox, poiché la stringa da decodificare potrebbe non essere una stringa codificata in base64 corretta:

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

È possibile utilizzare la routine seguente per convertire la stringa nel formato base64

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

Inoltre puoi usare l'ottimo strumento online OnlineUtility.in per codificare la stringa in formato base64


Gli strumenti online non aiutano in questa situazione - Sta chiedendo come codificarlo. Mi chiedo spesso perché la gente dice "Dai un'occhiata a questo strumento online!", Perché l'OP non ha richiesto uno strumento online: 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);
        }
    }

uso

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

4

Codifica / decodifica Base64 sicura per URL

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
La domanda non riguardava la codifica URL, ma è comunque utile ..
Momoro,

Whoops, lo ha pubblicato sotto la domanda sbagliata
juliushuck

Nessun problema, è ancora interessante vedere come codificare / decodificare un URL :)
Momoro

3

Puoi visualizzarlo in questo modo:

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;

Ora, riconvertendolo.

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

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

Spero che questo possa essere d'aiuto!


1

Per coloro che vogliono semplicemente codificare / decodificare singole cifre 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;
}

Esistono varie versioni di Base64 che non sono d'accordo su cosa usare per le cifre 62 e 63, quindi DecodeBase64Digitpossono tollerarne molte.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.