Une chaîne Base64 peut-elle contenir des onglets?
Question
Une simple question oui ou non et je suis sûr à 90% que c'est non ... mais je ne suis pas sûr.
Une chaîne Base64 peut-elle contenir des tabulations?
La solution
Cela dépend de ce que vous demandez. Si vous demandez si les onglets peuvent ou non être codés en base 64, la réponse est "oui". car ils peuvent être traités de la même manière que tout autre caractère ASCII.
Cependant, si vous demandez si la sortie en base 64 peut contenir des onglets, la réponse est non. Le lien suivant concerne un article détaillant la base 64, y compris les caractères considérés comme valides:
Autres conseils
La réponse courte est non - mais Base64 ne peut pas non plus contenir de retour chariot.
C’est pourquoi, si vous avez plusieurs lignes en Base64, vous supprimez les retours à la ligne, les sauts de ligne et tous les éléments ne figurant pas dans l’alphabet Base64
Cela inclut les onglets.
La version actuelle de PEM (spécifiée RFC 1421) utilise un caractère 64 caractères alphabet composé de lettres supérieures et caractères alphabétiques romains minuscules (A – Z, a – z), les chiffres (0–9) et le " + " et " / " symboles. Le " = " symbole est également utilisé comme un spécial code suffixe. L'original spécification, RFC 989, en plus utilisé le " * " symbole à délimiter codé mais des données non chiffrées dans la sortie flux.
Comme vous pouvez le constater, les caractères de tabulation ne sont pas inclus. Cependant, vous pouvez bien sûr encoder un caractère de tabulation dans une chaîne base64.
Bien sûr. Tab est juste le caractère ASCII 9, qui a une représentation en base64 comme tout autre entier.
Haha, comme vous pouvez le constater d'après les réponses, ce n'est en réalité pas une réponse simple, oui / non.
Une chaîne Base64 résultante après la conversion ne peut pas contenir de caractère de tabulation, mais il me semble que vous ne demandez pas cela, mais que vous demandez si vous représentez une chaîne (avant la conversion) contenant une tabulation en Base64, et la réponse à cette question est oui.
J'ajouterais que ce que vous devez réellement faire est de vous assurer de conserver le codage de votre chaîne, c'est-à-dire de le convertir en un tableau d'octets avec votre codage correct (Unicode, UTF-8 ou autre), puis de le convertir. ce tableau d'octets à base64.
EDIT: un test simple.
private void button2_Click(object sender, EventArgs e)
{
StringBuilder sb = new StringBuilder();
string test = "The rain in spain falls \t mainly on the plain";
sb.AppendLine(test);
UTF8Encoding enc = new UTF8Encoding();
byte[] b = enc.GetBytes(test);
string cvtd = Convert.ToBase64String(b);
sb.AppendLine(cvtd);
byte[] c = Convert.FromBase64String(cvtd);
string backAgain = enc.GetString(c);
sb.AppendLine(backAgain);
MessageBox.Show(sb.ToString());
}
La spécification Base64 ( RFC 4648 ) indique Section 3.3 , tous les caractères non alphabétiques rencontrés doivent être rejetés, sauf autorisation explicite fournie par une autre spécification:
Les implémentations DOIVENT rejeter le données encodées si elles contiennent
caractères en dehors de l'alphabet de base lors de l'interprétation de données codées en base
données, sauf spécification se référant explicitement à ce document déclare autrement. Ces spécifications peut plutôt indiquer, comme MIME, que les personnages en dehors de la base alphabet de codage devrait simplement être ignoré lors de l'interprétation des données (" être libérale dans ce que vous acceptez "). Notez que cela signifie que tout retour chariot / saut de ligne adjacent (CRLF) les caractères constituent "caractères autres que l'alphabet" et sont ignoré.
Des spécifications telles que PEM ( RFC 1421 ) et MIME ( RFC 2045 ) spécifie que les chaînes Base64 peuvent être fractionnées par des espaces. Selon le RFC 822 référencé, un onglet (HTAB) est considéré comme un caractère d'espacement.
Ainsi, lorsque Base64 est utilisé dans le contexte de MIME ou de PEM (et probablement d’autres spécifications similaires), les espaces, y compris les tabulations, doivent être gérés (supprimés) lors du décodage du contenu encodé.
Convert.FromBase64String ()
dans le framework .NET ne semble pas s'en soucier. Je crois que tous les espaces de la chaîne sont ignorés.
string xxx = "ABCD\tDEFG"; //simulated Base64 encoded string w/added tab
Console.WriteLine(xxx);
byte[] xx = Convert.FromBase64String(xxx); // convert string back to binary
Console.WriteLine(BitConverter.ToString(xx));
sortie:
ABCD DEFG
00-10-83-0C-41-46
La clause pertinente de la RFC-2045 (6: 8)
Le flux de sortie encodé doit être représenté en lignes de pas plus de 76 caractères chacun. Toutes les lignes pauses ou autres personnages non figurant dans le tableau 1 doivent être ignorés par logiciel de décodage. En données base64, caractères autres que ceux de la table 1, sauts de ligne et autres blancs l'espace indique probablement une transmission erreur, à propos de laquelle un avertissement message ou même un rejet de message pourrait être approprié sous certains circonstances.
OUI!
Base64 est utilisé pour coder TOUTE valeur 8 bits (décimal 0 à 255) dans une chaîne à l'aide d'un ensemble de caractères de sécurité. La tabulation est décimale 9.
La base 64 utilise l'un des jeux de caractères suivants:
Data: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
URLs: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_
Les pièces jointes binaires (par exemple, email) dans le texte sont également codées à l'aide de ce système.
Il semble qu’il y ait beaucoup de confusion ici; Et étonnamment, la plupart des réponses sont de " Non " variété. Je ne pense pas que ce soit une bonne réponse canonique. La cause de la confusion est probablement le fait que Base64 n’est pas strictement spécifié; de multiples implémentations et interprétations pratiques existent. Vous pouvez consulter le texte du lien pour plus d'informations à ce sujet.
En général, cependant, les codecs conformes à la norme Base64 DEVRAIENT comprendre les sauts de ligne, car ils sont prescrits par certaines définitions base64 (segments de 76 caractères, puis par saut de ligne, etc.). De ce fait, la plupart des décodeurs autorisent également les espaces de mise en retrait, et très souvent tous les espaces entre "triplets" à 4 caractères. (ainsi nommés car ils codent 3 octets).
Il est donc fort probable que, dans la pratique, vous puissiez utiliser des tabulations et autres espaces vierges.
Mais je ne voudrais pas ajouter moi-même d'onglets si le contenu en base64 est envoyé à un service - soyez conservateur quant à ce que vous envoyez, plus libéral quant à ce que vous recevez.