Pourquoi utilisons-nous Base64?

Wikipedia says

Base64 les schémas d'encodage sont couramment utilisés lorsqu'il est nécessaire d'encoder des données binaires qui doivent être stockées et transférées sur des supports conçus pour traiter des données textuelles. Il s'agit de s'assurer que les données restent intactes sans modification pendant le transport.

mais n'est-ce pas que les données sont toujours stockées/transmises en binaire parce que la mémoire que notre les machines ont binaire de magasin et cela dépend comment vous l'interprétez? Ainsi, que vous encodiez le motif de bits 010011010110000101101110 comme Man en ASCII ou comme TWFu en Base64, vous allez éventuellement stocker le même motif de bits.

si l'encodage ultime est en termes de zéros et de uns et que chaque machine et support peut les traiter, quelle importance cela a-t-il si les données sont représentées comme ASCII ou Base64?

qu'est-Ce moyen "médias qui sont conçus pour traiter des données textuelles"? Ils peuvent traiter avec binaire => ils peuvent traiter avec n'importe quoi.


merci à tous, je pense que je comprends maintenant.

lorsque nous envoyons des données, nous ne pouvons pas être sûrs que les données seraient interprétées dans le même format que celui que nous avions prévu. Nous envoyons donc des données codées dans un format (comme Base64) que les deux parties comprennent. Même si l'expéditeur et le destinataire interprètent les mêmes choses différemment, mais parce qu'ils s'entendent sur le format codé, les données ne seront pas mal interprétées.

à Partir de Marque Byers exemple

si je veux envoyer

Hello
world!

est Une façon de l'envoyer en ASCII comme

72 101 108 108 111 10 119 111 114 108 100 33

mais le octet 10 pourrait ne pas être interprété correctement comme une nouvelle ligne à l'autre extrémité. Donc, nous utilisons un sous-ensemble D'ASCII pour l'encoder comme ceci

83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61

qui, au coût de plus de données transférées pour la même quantité d'informations, garantit que le destinataire peut décoder les données de la manière prévue, même si le destinataire a des interprétations différentes pour le reste du jeu de caractères.

179
demandé sur mega6382 2010-08-21 19:21:08

12 réponses

votre première erreur est de penser que l'encodage ASCII et L'encodage Base64 sont interchangeables. Ils ne le sont pas. Ils sont utilisés à des fins différentes.

  • lorsque vous encodez du texte en ASCII, vous commencez avec une chaîne de texte et la convertissez en une séquence d'octets.
  • lorsque vous encodez des données dans Base64, vous commencez avec une séquence d'octets et la convertissez en chaîne de texte.

pour comprendre pourquoi Base64 était nécessaire, en premier lieu, nous avons besoin d'un peu de l'histoire de l'informatique.


les ordinateurs communiquent en binaire - 0s et 1s - mais les gens veulent généralement communiquer avec des données de formes plus riches tels que le texte ou des images. Pour transférer ces données entre ordinateurs, il faut d'abord les encoder en 0s et 1s, puis les envoyer, puis les décoder à nouveau. Pour prendre le texte comme exemple - il y a plusieurs façons d'effectuer ce codage. Il serait beaucoup plus simple si nous pourrait tous convenir d'un encodage unique, mais malheureusement ce n'est pas le cas.

à l'origine, un grand nombre d'encodages différents ont été créés (par exemple code Baudot ) qui utilisaient un nombre différent de bits par caractère jusqu'à ce que ASCII devienne un standard avec 7 bits par caractère. Toutefois, la plupart des ordinateurs stockent des données binaires en octets de 8 bits chacun, de sorte que ASCII ne convient pas pour transférer ce type de données. Certains systèmes essuyez même le morceau le plus significatif. De plus, les différences dans les codages de fin de ligne entre les systèmes signifient que les caractères ASCII 10 et 13 ont aussi été parfois modifiés.

pour résoudre ces problèmes Base64 encodage a été introduit. Cela vous permet d'encoder des octets aribtraires vers des octets qui sont connus pour être sûrs d'envoyer sans être corrompus (caractères alphanumériques ASCII et quelques symboles). L'inconvénient est que l'encodage du message L'utilisation de Base64 augmente sa longueur - chaque 3 octets de données est encodé en 4 caractères ASCII.

pour envoyer du texte de manière fiable, vous pouvez d'abord encoder les octets en utilisant un codage de texte de votre choix (par exemple UTF-8) et ensuite ensuite Base64 Encoder les données binaires résultantes dans une chaîne de texte qui est sûr pour envoyer encodé ASCII. Le récepteur devra inverser ce processus pour récupérer le message d'origine. Bien sûr, cela exige que le récepteur sache quels encodages ont été utilisés, et cette information doit souvent être envoyée séparément.

historiquement, il a été utilisé pour encoder des données binaires dans les messages de courrier électronique où le serveur de courrier électronique pourrait modifier les terminaisons de ligne. Un exemple plus moderne est L'utilisation de L'encodage Base64 pour intégrer des données d'image directement dans le code source HTML . Ici, il est nécessaire d'encoder les données pour éviter les caractères comme '<' et '>' être interprétées comme des balises.


voici un exemple travaillé:

je souhaite envoyer un message texte avec deux lignes

Hello
world!

si je l'envoie comme ASCII (ou UTF-8) il ressemblera à ceci:

72 101 108 108 111 10 119 111 114 108 100 33

le octet 10 est corrompu dans certains systèmes de sorte que nous pouvons baser 64 encoder ces octets comme une chaîne de base64:

SGVsbG8sCndvcmxkIQ==

qui, lorsqu'il est encodé en utilisant ASCII, ressemble à ceci:

83 71 86 115 98 71 56 115 67 110 100 118 99 109 120 107 73 61 61

tous les octets ici sont des octets sûrs connus, il y a donc très peu de chance qu'un système puisse corrompre ce message. Je peux envoyer ceci à la place de mon message original et laisser le récepteur inverser le processus pour récupérer le message original.

201
répondu Mark Byers 2010-08-21 18:02:29

encodage de données binaires en XML

supposons que vous voulez intégrer quelques images dans un document XML. Les images sont des données binaires, tandis que le document XML est du texte. Mais le XML ne peut pas traiter les données binaires intégrées. Alors, comment faites-vous?

une option est d'encoder les images dans base64, en transformant les données binaires en texte que XML peut gérer.

au lieu de:

<images>
  <image name="Sally">{binary gibberish that breaks XML parsers}</image>
  <image name="Bobby">{binary gibberish that breaks XML parsers}</image>
</images>

vous n':

<images>
  <image name="Sally" encoding="base64">j23894uaiAJSD3234kljasjkSD...</image>
  <image name="Bobby" encoding="base64">Ja3k23JKasil3452AsdfjlksKsasKD...</image>
</images>

et L'analyseur XML seront en mesure d'analyser correctement le document XML et d'extraire les données d'image.

39
répondu yfeldblum 2018-06-19 21:24:13

pourquoi ne pas regarder la RFC qui définit actuellement Base64 ?

encodage de Base de données est utilisé dans de nombreuses situations pour stocker ou transférer

de données dans des environnements qui, peut-être pour les raisons historiques, sont limitées à Données US-ASCII [1].La Base de l'encodage peut également être utilisé dans de nouvelles applications qui n'ont pas d'héritage restrictions, tout simplement parce qu'il rend possible pour manipuler des objets avec du texte éditeur.

dans le passé, différentes applications ont eu des exigences différentes et ainsi parfois mis en œuvre base encodages légèrement différents façon. Aujourd'hui, les spécifications du protocole utiliser parfois des codages de base général, et "base64" en particulier, sans description précise ou référence. Courrier Internet Polyvalent Extensions (MIME) [4] est souvent utilisé comme référence pour base64 sans considérant les conséquences pour l'habillage de ligne ou non de l'alphabet caractère. Le but de cette la spécification est d'établir des alphabet et encodage considération. Ce sera, nous l'espérons réduire l'ambiguïté dans les autres documents, conduisant à une meilleure interopérabilité.

Base64 a été conçu à l'origine comme un moyen de permettre aux données binaires d'être attachés aux e-mails dans le cadre des Extensions de courrier Internet polyvalentes.

31
répondu Billy ONeal 2010-08-21 15:39:00

médias qui est conçu pour les données textuelles est bien sûr éventuellement binaire ainsi, mais les médias textuels utilisent souvent certaines valeurs binaires pour les caractères de contrôle. En outre, les médias textuels peuvent rejeter certaines valeurs binaires comme non-texte.

Base64 encoding code les données binaires comme des valeurs qui ne peuvent être interprétées que comme du texte sur des supports textuels, et est libre de tout caractère spécial et/ou des caractères de contrôle, de sorte que les données seront préservées sur des supports textuels ainsi.

21
répondu Håvard S 2010-08-21 15:25:22

il est plus que le média valide le codage de chaîne, nous voulons donc nous assurer que les données sont acceptables par une application de traitement (et ne contient pas une séquence binaire représentant EOL par exemple)

Imaginez que vous voulez envoyer des données binaires dans un e-mail avec encodage UTF-8 -- l'e-mail peut ne pas s'afficher correctement si le flux de uns et de zéros crée une "séquence 151930920" qui n'est pas Unicode valide dans l'encodage UTF-8.

le même type de chose se produit dans les URLs quand nous voulons encoder des caractères non valides pour une URL dans L'URL elle-même:

http://www.foo.com/hello mon ami - > http://www.foo.com/hello%20my%20friend

C'est parce que nous voulons envoyer à un espace sur un système qui pense l'espace est puant.

Tout ce que nous faisons est s'assurer qu'il y a une correspondance de 1 à 1 entre une séquence de bits bien connue, acceptable et non préjudiciable et une autre séquence littérale de bits, et que la demande de traitement ne distingue pas de l'encodage.

dans votre exemple, man peut être valide ASCII en première forme; mais souvent vous pouvez vouloir transmettre des valeurs qui sont binaires aléatoires (c'est-à-dire envoyer une image dans un courriel):

MIME-Version: 1.0

Content-Description: "Base64 encodage de a.gif "

Content-Type: image/ gif; name = "a.gif "

Contenu-Transfert-Encodage: Base64

Content-Disposition: attachment; filename="a.gif "

ici nous voyons qu'une image GIF est codée en base64 comme un morceau d'un email. Le client de messagerie lit les en-têtes et le décode. En raison de l'encodage, on peut être sûr le GIF ne contient rien qui puisse être interprété comme un protocole et nous évitons d'insérer des données que SMTP ou POP peuvent trouver significatives.

15
répondu Aiden Bell 2010-08-21 15:35:07

un exemple de quand je l'ai trouvé commode était en essayant données binaires embed dans XML . Certaines données binaires étaient mal interprétées par l'analyseur SAX parce que ces données pouvaient être littéralement n'importe quoi, y compris les caractères spéciaux XML. Base64 Encoder les données sur l'extrémité d'émission et les décoder sur l'extrémité de réception a résolu ce problème.

11
répondu Bill the Lizard 2017-05-23 12:34:37

la plupart des ordinateurs stockent des données en format binaire 8 bits, mais ce n'est pas une exigence. Certaines machines et supports de transmission ne peuvent traiter que 7 bits (ou peut-être même moins) à la fois. Un tel médium interpréterait le flux en multiples de 7 bits, donc si vous deviez envoyer des données 8 bits, vous ne recevrez pas ce que vous attendez de l'autre côté. La Base-64 n'est qu'un moyen de résoudre ce problème: vous encodez l'entrée dans un format de 6 bits, vous l'envoyez sur votre support et vous la décodez de nouveau dans un format de 8 bits à la fin de réception.

8
répondu casablanca 2010-08-21 15:32:17

Base64 au lieu d'échapper aux caractères spéciaux

je vais vous donner un exemple très différent mais réel: j'écris du code javascript pour être exécuté dans un navigateur. Les balises HTML ont des valeurs ID, mais il y a des contraintes sur ce que les caractères sont valides dans un ID.

mais je veux que mon ID renvoie sans perte aux fichiers de mon système de fichiers. Les fichiers en réalité peuvent avoir toutes sortes de caractères bizarres et merveilleux en eux de points d'exclamation, caractères accentués, tilde, même emoji! Je ne peux pas faire cela:

<div id="/path/to/my_strangely_named_file!@().jpg">
    <img src="http://myserver.com/path/to/my_strangely_named_file!@().jpg">
    Here's a pic I took in Moscow.
</div>

supposons que je veuille exécuter un code comme ceci:

# ERROR
document.getElementById("/path/to/my_strangely_named_file!@().jpg");

je pense que ce code échouera une fois exécuté.

avec Base64 je peux faire référence à quelque chose de compliqué sans me soucier de savoir quelle langue permet quels caractères spéciaux et quels sont ceux qui doivent s'échapper:

document.getElementById("18GerPD8fY4iTbNpC9hHNXNHyrDMampPLA");

Contrairement à l'utilisation d'un MD5 ou une autre fonction de hachage, vous pouvez inverser l'encodage découvrez ce que les données étaient exactement qui est réellement utile.

si seulement je connaissais Base64 ans. J'aurais évité de me déchirer les cheveux avec encodeURIComponent ' et str.replace(‘\n’,’\n’)

6
répondu Sridhar-Sarnobat 2018-06-20 06:19:58

Que signifie "médias qui sont conçu pour traiter les données textuelles"?

que ces protocoles ont été conçus pour traiter du texte (souvent, seulement anglais texte) au lieu de données binaires (comme .png et .des images jpg).

Ils peuvent traiter avec binaire => ils peuvent face à quoi que ce soit.

, Mais l'inverse n'est pas vrai. Un protocole conçu pour represent text peut traiter incorrectement des données binaires qui se trouvent contenir:

  • les octets 0x0A et 0x0D, utilisés pour les fins de ligne, qui diffèrent par plate-forme.
  • autres caractères de contrôle comme 0x00 (NULL = terminateur de chaîne C), 0x03 (fin de texte), 0x04 (fin de TRANSMISSION), ou 0x1A (DOS fin de fichier) qui peuvent signaler prématurément la fin des données.
  • octets au-dessus de 0x7F (si le protocole qui a été conçu pour ASCII).
  • séquences D'octets invalides UTF-8.

donc vous ne pouvez pas simplement envoyer des données binaires sur un protocole basé sur un texte. Vous êtes limité aux octets qui représentent les caractères ASCII Non-contrôle non-espace, dont il y a 94. La raison pour laquelle la base 64 a été choisie est qu'il est plus rapide de travailler avec des pouvoirs de deux, et 64 est le plus grand qui fonctionne.

une question cependant. Comment est-ce les systèmes ne fonctionnent toujours pas d'accord sur la commune technique d'encodage comme le si commun UTF-8?

sur le Web, du moins, ils l'ont la plupart du temps. la majorité des sites utilisent UTF-8 .

le problème dans L'Ouest est qu'il y a beaucoup de vieux logiciels qui ass-u-me-s que 1 octet = 1 caractère et ne peut pas fonctionner avec UTF-8.

le problème à L'Est est leur attachement à des codages comme GB2312 et Shift_JIS.

et le fait que Microsoft semble ne pas s'être encore remis d'avoir choisi le mauvais encodage UTF. Si vous voulez utiliser L'API Windows ou la bibliothèque d'exécution Microsoft C, vous êtes limité à UTF-16 ou l'encodage "ANSI" de la locale. Cela rend l'utilisation de L'UTF-8 douloureuse parce que vous devez convertir tout le temps.

4
répondu dan04 2010-08-21 18:24:34

en plus des autres (assez longues) réponses: même en ignorant les vieux systèmes qui prennent en charge seulement 7-bit ASCII, les problèmes de base avec la fourniture de données binaires en mode texte sont:

  • les nouvelles lignes sont généralement transformées en mode texte.
  • il faut faire attention à ne pas traiter un octet NUL comme la fin d'une chaîne de texte, ce qui est trop facile à faire dans n'importe quel programme avec la lignée C.
3
répondu jamesdlin 2010-08-21 17:27:58

Qu'entend-on par"supports conçus pour traiter des données textuelles"?

à l'époque où les ASCII régnaient sur les valeurs non-ASCII était un casse-tête. Les gens ont sauté à travers toutes sortes de cerceaux pour obtenir ces transféré par le fil sans perdre l'information.

2
répondu dirkgently 2010-08-21 15:24:34

pourquoi / comment utiliser l'encodage Base64?

Base64 est l'un des schémas d'encodage binaire-texte ayant une efficacité de 75%. Il est utilisé de sorte que les données binaires typiques (telles que des images) peuvent être envoyées en toute sécurité sur les canaux hérités "pas 8-bit clean". Dans les réseaux de messagerie antérieurs (jusqu'au début des années 1990), la plupart des messages étaient en texte clair dans le jeu de caractères 7 bits US-ASCII. Ainsi, les premières normes du protocole comm ont été conçues pour fonctionner sur des liaisons comm "7-bit" et non pas sur des liaisons 8-bit "clean". Régime l'efficacité est le rapport entre le nombre de bits dans l'entrée et le nombre de bits dans l'encodage de sortie. Hexadécimal (Base16) est également l'un des schémas d'encodage binaire-texte avec une efficacité de 50%.

De L'Encodage Base64 Étapes (Simplifié):

  1. les données binaires sont disposées en blocs continus de 24 bits (3 octets) chacun.
  2. chaque morceau de 24 bits est regroupé en quatre parties de 6 bits chacune.
  3. chaque 6 bits le groupe est converti en valeurs de caractères de Base64, C'est-à-dire que l'encodage de Base64 convertit trois octets en quatre caractères encodés. Le rapport entre les octets de sortie et les octets d'entrée est de 4: 3 (33% de frais généraux).
  4. fait intéressant, les mêmes caractères seront encodés différemment selon leur position dans le groupe de trois octets qui est encodé pour produire les quatre caractères.
  5. Le séquestre devra inverser ce processus pour récupérer l'original message.
1
répondu Mushtaq Hussain 2018-04-17 19:01:16