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?

Était-ce utile?

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:

http://fr.wikipedia.org/wiki/Base64

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.

De wikipedia.com:

  

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top