S'il s'agit d'une question et d'une réponse de «partage des connaissances», je pense que nous recherchons quelque chose d'un peu plus en profondeur. Une recherche rapide de SO apparaît également: stackoverflow.com/a/7368168/419
Kev
1
@Gnark Toute chaîne est codée par un certain schéma de codage binaire sous-jacent. Que ce soit ASCII, UTF7, UTF8, .... La question posée est au mieux incomplète.
Lorenz Lo Sauer
2
Demandez-vous avez-vous vraiment besoin de faire cela? Rappelez-vous que base64 est principalement destiné à représenter des données binaires en ASCII, à stocker dans un champ char dans une base de données ou à envoyer par e-mail (où de nouvelles lignes pourraient être injectées). Voulez-vous vraiment prendre des données de caractères, les convertir en octets, puis les reconvertir en données de caractères, cette fois illisibles et sans aucune indication de ce qu'était l'encodage d'origine?
bbsimonbb
Pourquoi devrions-nous nous soucier de l'encodage d'origine? Nous encodons la chaîne en octets en utilisant la représentation UTF8, qui peut représenter tous les caractères de chaîne possibles. Nous sérialisons ensuite ces données et à l'autre extrémité, nous désérialisons ces données et nous reconstruisons la même chaîne que nous avions à l'origine (l'objet chaîne ne contient pas les informations sur l'encodage utilisées de toute façon). Alors, pourquoi y a-t-il des problèmes liés au codage utilisé? Nous pouvons le considérer comme une manière exclusive de représenter les données sérialisées, ce qui ne devrait en aucun cas nous intéresser.
Null vérifie les chaînes d'entrée dans les deux fonctions et la solution est parfaite :)
Sverrir Sigmundarson
22
@SverrirSigmundarson: Cela ou en faire des méthodes d'extension.
TJ Crowder
73
@SverrirSigmundarson - Pourquoi faire une vérification nulle? Ce n'est pas lui qui déréférence la chaîne d'entrée. Les contrôles nuls devraient empêcher NullReferenceExceptiondans votre propre code, pas dans celui de quelqu'un d'autre.
ken
16
@ken Et quelqu'un d'autre dira "vous ne devez exposer que les erreurs dans votre propre code, pas celles de quelqu'un d'autre", invoquant le principe de la moindre surprise, épicé avec "échec précoce" et "encapsulation appropriée". Parfois, cela signifie encapsuler les erreurs des composants de niveau inférieur, parfois autre chose entièrement. Dans ce cas, je conviens que le wrapping d'une erreur deref est certainement douteux (en plus, nous sommes tous d'accord lentement sur le fait que null en tant que concept est un peu un hack pour commencer), mais nous pouvons toujours voir certains effets sinon: le nom du paramètre donné dans l'exception peut ne pas être correct s'il n'est pas coché.
TNE
6
return System.Text.Encoding.UTF8.GetString (base64EncodedBytes, 0, base64EncodedBytes.Length); pour windows phone 8
steveen zoleko
46
Je partage mon implémentation avec quelques fonctionnalités intéressantes:
utilise des méthodes d'extension pour la classe Encoding. La justification est que quelqu'un peut avoir besoin de prendre en charge différents types d'encodages (pas seulement UTF8).
Une autre amélioration échoue gracieusement avec un résultat nul pour une entrée nulle - il est très utile dans les scénarios réels et prend en charge l'équivalence pour X = décoder (encoder (X)).
Remarque: N'oubliez pas que pour utiliser la méthode d'extension, vous devez (!) Importer l'espace de noms avec un usingmot-clé (dans ce cas using MyApplication.Helpers.Encoding).
Le retour nullen cas de nullest un comportement très incohérent. Aucune autre API .net qui fonctionne avec des chaînes ne fait cela.
t3chb0t
4
@ t3chb0t n'hésitez pas à l'adapter à vos besoins. Comme la façon dont elle est présentée ici a été ajustée à la nôtre. Ce n'est pas une API publique;)
andrew.fox
1
N'avez-vous pas maintenant à envoyer 2 variables à l'autre partie de votre communication (à qui vous envoyez des données encodées en base64)? Vous devez envoyer à la fois l'encodage utilisé et les données réelles en base64? N'est-il pas plus facile si vous utilisez une convention des deux côtés d'utiliser le même encodage? De cette façon, vous n'auriez qu'à envoyer des données base64, non?
Mladen B.
38
Sur la base des réponses d'Andrew Fox et de Cebe, je l'ai inversé et leur ai fait des extensions de chaîne au lieu des extensions Base64String.
J'ajouterais un ParseBase64 (ce texte de chaîne, le codage d'encodage, la chaîne decodedText) (pour remplir l'exception si nécessaire, et l'appeler sur TryParseBase64
João Antunes
22
Une légère variation sur la réponse d'andrew.fox, car la chaîne à décoder peut ne pas être une chaîne encodée en base64 correcte:
Les outils en ligne n'aident pas dans cette situation - il demande comment le coder. Je me demande souvent pourquoi les gens disent "Découvrez cet outil en ligne!", Parce que le PO n'a pas demandé un outil en ligne: D
publicstaticclassBase64Url{publicstaticstringEncode(string text){returnConvert.ToBase64String(Encoding.UTF8.GetBytes(text)).TrimEnd('=').Replace('+','-').Replace('/','_');}publicstaticstringDecode(string text){
text = text.Replace('_','/').Replace('-','+');switch(text.Length%4){case2:
text +="==";break;case3:
text +="=";break;}returnEncoding.UTF8.GetString(Convert.FromBase64String(text));}}
La question n'était pas sur le codage d'URL, mais toujours utile ..
Momoro
Oups, l'a affiché sous la mauvaise question
juliushuck
Pas de problème, c'est quand même intéressant de voir comment encoder / décoder une URL :)
Momoro
3
Vous pouvez l'afficher comme ceci:
var strOriginal = richTextBox1.Text;byte[] byt =System.Text.Encoding.ASCII.GetBytes(strOriginal);// convert the byte array to a Base64 stringstring strModified =Convert.ToBase64String(byt);
richTextBox1.Text=""+ strModified;
Maintenant, reconvertissez-le.
var base64EncodedBytes =System.Convert.FromBase64String(richTextBox1.Text);
richTextBox1.Text=""+System.Text.Encoding.ASCII.GetString(base64EncodedBytes);MessageBox.Show("Done Converting! (ASCII from base64)");
Il existe différentes versions de Base64 qui ne sont pas d'accord sur ce qu'il faut utiliser pour les chiffres 62 et 63, donc DecodeBase64Digitpeuvent en tolérer plusieurs.
Réponses:
Encoder
Décoder
la source
NullReferenceException
dans votre propre code, pas dans celui de quelqu'un d'autre.Je partage mon implémentation avec quelques fonctionnalités intéressantes:
Remarque: N'oubliez pas que pour utiliser la méthode d'extension, vous devez (!) Importer l'espace de noms avec un
using
mot-clé (dans ce casusing MyApplication.Helpers.Encoding
).Code:
Exemple d'utilisation:
la source
null
en cas denull
est un comportement très incohérent. Aucune autre API .net qui fonctionne avec des chaînes ne fait cela.Sur la base des réponses d'Andrew Fox et de Cebe, je l'ai inversé et leur ai fait des extensions de chaîne au lieu des extensions Base64String.
la source
Une légère variation sur la réponse d'andrew.fox, car la chaîne à décoder peut ne pas être une chaîne encodée en base64 correcte:
la source
Vous pouvez utiliser la routine ci-dessous pour convertir une chaîne au format base64
Vous pouvez également utiliser un très bon outil en ligne OnlineUtility.in pour coder une chaîne au format base64
la source
Usage
la source
Encodage / décodage Base64 sûr pour les URL
la source
Vous pouvez l'afficher comme ceci:
Maintenant, reconvertissez-le.
J'espère que ça aide!
la source
Pour ceux qui veulent simplement encoder / décoder des chiffres base64 individuels:
Il existe différentes versions de Base64 qui ne sont pas d'accord sur ce qu'il faut utiliser pour les chiffres 62 et 63, donc
DecodeBase64Digit
peuvent en tolérer plusieurs.la source