Bir base64 dizesini nasıl kodlayıp çözebilirim?


885
  1. Bir dize verilen base64 kodlu dizeyi nasıl döndürürüm?

  2. Base64 kodlu bir dizeyi bir dizeye nasıl çözerim?


4
Eğer bu bir "bilgiyi paylaşmak" sorusu ve cevabı ise, sanırım biraz daha derinlemesine bir şey arıyoruz. Ayrıca SO hızlı bir arama ortaya çıkıyor: stackoverflow.com/a/7368168/419
Kev

1
@Gnark Herhangi bir dize, belirli bir temel bit kodlama şeması tarafından kodlanır. ASCII, UTF7, UTF8, .... Olursa sorulan soru en iyi ihtimalle eksiktir.
Lorenz Lo Sauer

2
Kendinize sorun gerçekten bunu yapmanız mı gerekiyor? Base64'in öncelikle ASCII'deki ikili verileri temsil etmek, bir veritabanındaki bir char alanında depolamak veya e-posta yoluyla göndermek için (yeni satırların enjekte edilebileceği) amaçlandığını unutmayın. Gerçekten karakter verilerini almak, baytlara dönüştürmek, sonra tekrar karakter verilerine dönüştürmek mi istiyorsunuz, bu sefer okunamaz ve orijinal kodlamanın ne olduğuna dair bir ipucu olmadan?
bbsimonbb

Orijinal kodlamayı neden önemsemeliyiz? Dize, olası tüm dize karakterlerini temsil edebilen UTF8 gösterimini kullanarak baytlara kodlar. Daha sonra bu verileri serileştiririz ve diğer tarafta bu verileri serileştiririz ve başlangıçta sahip olduğumuz dizgeyi yeniden yapılandırırız (dize nesnesi zaten kullanılan kodlamayla ilgili bilgileri tutmaz). Peki neden kullanılan kodlama ile ilgili herhangi bir endişe var? Yine de ilgilenmemiz gereken serileştirilmiş verileri temsil etmenin özel bir yolu olarak düşünebiliriz.
Mladen B.

Yanıtlar:


1667

kodlamak

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

Kod Çözme

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

41
Her iki fonksiyonda da giriş dizeleri için null kontroller ve çözüm mükemmel :)
Sverrir Sigmundarson

22
@SverrirSigmundarson: Bu veya onları genişletme yöntemleri yapın.
TJ Crowder

73
@SverrirSigmundarson - Neden boş bir kontrol var? Giriş dizesini kaydeden kişi o değil. Boş kontroller NullReferenceExceptionbaşkalarının değil kendi kodunuzda engellenmelidir .
ken

16
@ken Ve bir başkası "erken başarısız" ve "uygun kapsülleme" ile baharatlanmış en az sürpriz ilkesini çağırarak "sadece kendi kodunuzdaki hataları ortaya çıkarmalı, başkasının değil" diyecektir. Bazen bu, alt düzey bileşenlerin hatalarını, bazen de tamamen başka bir şeyleri sarmak anlamına gelir. Bu durumda, bir deref hatasını silmenin kesinlikle şüpheli olduğunu kabul edeceğim (ayrıca, bir kavram olarak null değerinin başlamak için biraz hack olduğu gerçeğini yavaşça kabul ediyoruz), ancak yine de bazı efektler görebiliriz aksi takdirde: istisnada verilen parametre adı işaretlenmezse doğru olmayabilir.
tne

6
dönüş System.Text.Encoding.UTF8.GetString (base64EncodedBytes, 0, base64EncodedBytes.Length); windows phone 8 için
steveen zoleko

46

Uygulamamı bazı düzgün özelliklerle paylaşıyorum:

  • Kodlama sınıfı için Genişletme Yöntemleri kullanır. Gerekçe, birinin farklı kodlama türlerini desteklemesi gerekebileceğidir (sadece UTF8'i değil).
  • Başka bir gelişme, null giriş için null sonuçla zarif bir şekilde başarısız oluyor - gerçek yaşam senaryolarında çok kullanışlıdır ve X = kod çözme (kodlama (X)) için eşdeğerliği destekler.

Not: Bu size Uzatma Yöntemi kullanmayı unutmayın zorunda (!) İle ad almak using(bu durumda anahtar kelime using MyApplication.Helpers.Encoding).

Kod:

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

Kullanım örneği:

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
Geri dönen nulldurumunda nullbir çok tutarsız bir davranıştır. Dizelerle çalışan başka hiçbir .net API'si bunu yapmaz.
t3chb0t

4
@ t3chb0t ihtiyaçlarınıza göre ayarlamak için çekinmeyin. Burada sunulduğu şekilde bizimkine göre ayarlandı. Bu herkese açık bir API değildir;)
andrew.fox

1
Artık iletişiminizdeki diğer tarafa 2 değişken göndermek zorunda değil misiniz (base64 kodlanmış veri gönderdiğiniz kime)? Hem kullanılan kodlamayı hem de gerçek base64 verilerini mi göndermeniz gerekiyor? Her iki tarafta da aynı kodlamayı kullanmak için bir kural kullanırsanız daha kolay olmaz mı? Bu şekilde yalnızca base64 verilerini göndermeniz gerekir, değil mi?
Mladen

38

Andrew Fox ve Cebe'nin cevaplarına dayanarak, onu döndüm ve Base64String uzantıları yerine dize uzantıları yaptım.

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
Bir ParseBase64 (bu dize metni, kodlama kodlama, dize decodedText dışarı) eklemek (gerekirse istisna doldurmak ve TryParseBase64
João Antunes

22

Kod çözülecek dize doğru base64 kodlu dize olmayabileceğinden, andrew.fox cevabında küçük bir varyasyon:

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

Dizeyi base64 biçimine dönüştürmek için aşağıdaki yordamı kullanabilirsiniz

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

Ayrıca dize base64 biçiminde kodlamak için çok iyi bir çevrimiçi araç OnlineUtility.in kullanabilirsiniz


Çevrimiçi araçlar bu durumda yardımcı olmuyor - BT'nin nasıl KODLANMASI gerektiğini soruyor. İnsanların neden "Bu çevrimiçi araca göz atın!" Dediğini merak ediyorum, çünkü OP çevrimiçi bir araç istemedi: 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);
        }
    }

kullanım

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

4

URL güvenli Base64 Kodlama / Kod Çözme

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
Soru URL Kodlamasıyla ilgili değildi, ama yine de yararlı ..
Momoro

Hata! Yanlış soru altında yayınladı
juliushuck

Sorun değil, bir URL'nin nasıl kodlanacağını /
kodunun

3

Bunu şu şekilde görüntüleyebilirsiniz:

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;

Şimdi, onu geri dönüştürüyoruz.

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

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

Umarım bu yardımcı olur!


1

Sadece bağımsız base64 basamaklarını kodlamak / kodunu çözmek isteyenler için:

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

Base64'ün, 62 ve 63 rakamları için ne kullanılacağı konusunda aynı fikirde olmayan çeşitli versiyonları vardır , bu nedenle DecodeBase64Digitbunlardan birkaçını tolere edebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.