Pourquoi utilisons-nous Base64?
Wikipédia dit
De l'encodage Base64 régimes sont souvent utilisés lorsqu'il est nécessaire de coder en binaire des données qui doivent être stockées et transférées sur les médias qui sont conçus pour traiter les données textuelles. Ceci est pour s'assurer que les données restent intactes, sans modification pendant le transport.
Mais n'est-il pas que les données sont toujours stockées et/ou transmise en binaire parce que la mémoire que nos machines ont stocker les binaires et cela dépend comment vous l'interpréter? Donc, si vous encodez le motif de bits 010011010110000101101110
comme Man
en ASCII ou en tant que TWFu
en Base64, vous êtes finalement va stocker le même modèle de bits.
Si l'ultime encodage est en termes de zéros et de uns et de chaque machine et les médias peuvent traiter avec eux, comment est-ce grave si les données sont représentées au format ASCII ou Base64?
Que signifie "médias qui sont conçus pour traiter les données textuelles"? Ils peuvent traiter avec les binaires => ils peuvent faire face à quoi que ce soit.
Merci tout le monde, je crois que je comprends maintenant.
Lorsque nous envoyer plus de données, nous ne pouvons pas être sûr que les données seront interprétées dans le même format que nous avons prévu. Ainsi, nous envoyons plus de données codées dans un format quelconque (comme Base64) que les deux parties comprennent. De cette façon, même si l'expéditeur et le récepteur interpréter les mêmes choses différemment, mais parce qu'ils sont d'accord sur le format à codage, les données ne seront pas interprété à tort.
Si je veux envoyer
Hello
world!
Une solution est de l'envoyer en ASCII comme
72 101 108 108 111 10 119 111 114 108 100 33
Mais octet 10 peut ne pas être correctement interprétée comme un retour à la ligne, à l'autre extrémité. Ainsi, nous utilisons un sous-ensemble de l'ASCII à coder 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 transfert de données pour la même quantité d'information s'assure que le destinataire puisse le décoder les données de la manière prévue, même si le récepteur se trouve à avoir des interprétations différentes pour le reste du jeu de caractères.
- Contexte historique: les serveurs de Messagerie utilisés pour être en ASCII 7 bits. Beaucoup d'entre eux serait le haut de bits à 0 si vous avez eu à envoyer 7-valeurs des bits seulement. Voir en.wikipedia.org/wiki/Email#Content_encoding
- Vous pouvez (ou historiquement pourrait) se fonder uniquement sur le bas de l'ascii 7bits être la même entre les machines ou traduisible entre les machines, en particulier lorsqu'il n'est pas sur toutes les machines utilisées ascii
- Nous utilisons base64 parce que c'est plus lisible que Perl
- vous plaisantez. Perl est dur à lire, mais en base64 est illisible à tous.
- Pour l'enregistrement, le plus de bonne réponse ci-dessous est Aiden Bell. Le 7/8 bits préoccupations, encodage, etc, bien que valides, ne sont pas la raison de base: données arbitraires ne doit pas être interprété à tort comme protocole. Le transformer en base64 empêche cela. E. g. des problèmes avec les pièces jointes des emails contenant des pièces jointes.
- Votre image est manquant
- octet 10 peut ne pas être correctement interprétée comme un retour à la ligne, à l'autre bout." pourquoi? les deux parties ont convenu de l'ASCII et ils doivent être de les interpréter correctement!
Vous devez vous connecter pour publier un commentaire.
Votre première erreur est de penser que le codage ASCII et de l'encodage Base64 sont interchangeables. Ils ne le sont pas. Ils sont utilisés à des fins différentes.
De comprendre pourquoi Base64 est nécessaire, en premier lieu, nous avons besoin d'un peu de l'histoire de l'informatique.
Ordinateurs de communiquer en binaire - 0s et 1s - mais les gens veulent généralement pour communiquer avec les plus riches de données de formulaires tels que du texte ou des images. Afin de transférer des données entre ordinateurs, il doit d'abord être codées en 0 et de 1, envoyé, puis décodé à nouveau. De prendre le texte comme un exemple - il y a beaucoup de différentes manières de réaliser ce codage. Il serait beaucoup plus simple si nous pouvions tous être d'accord sur un codage unique, mais malheureusement, ce n'est pas le cas.
À l'origine d'un grand nombre de différents codages ont été créés (par exemple,Le code Baudot) qui a utilisé un nombre de bits par caractère jusqu'à ce que finalement ASCII est devenu un standard avec 7 bits par caractère. Cependant, la plupart des ordinateurs de stocker des données binaires en octets composé de 8 bits chacun, donc ASCII est impropre à la tranferring ce type de données. Certains systèmes même effacer le bit le plus significatif. En outre, la différence en fin de ligne encodages à travers des systèmes de dire que le caractère ASCII 10 et 13 ont également été modifiés.
Pour résoudre ces problèmes Base64 le codage a été introduit. Ceci vous permet d'encoder aribtrary octets octets qui sont connus pour être sûr d'envoyer sans obtenir endommagé (ASCII des caractères alphanumériques et un couple de symboles). L'inconvénient est que l'encodage du message à l'aide Base64 augmente sa longueur - tous les 3 octets de données sont codées à 4 caractères ASCII.
Pour envoyer du texte de manière fiable, vous pouvez première codent pour des octets à l'aide d'un codage de texte de votre choix (par exemple UTF-8) et puis après Base64 encode le binaire résultant des données dans une chaîne de texte qui est sûr d'envoyer codé en ASCII. Le récepteur devra inverser ce processus pour récupérer le message d'origine. Bien sûr, cela nécessite que le récepteur sait qui les codages ont été utilisés, et cette information doit être envoyée séparément.
Historiquement, il a été utilisé pour encoder des données binaires dans les messages où le serveur de messagerie est susceptible de modifier la ligne de terminaisons. Un exemple plus modern est l'utilisation de l'encodage Base64 pour incorporer les 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.
Ici est un exemple:
Je souhaite envoyer un message texte avec deux lignes
Si je l'envoyer au format ASCII (ou UTF-8), il ressemblera à ceci:
L'octet 10 est corrompu dans certains systèmes, on peut donc en base 64 encoder ces octets comme une chaîne Base64:
Qui lorsqu'ils sont encodés à l'aide de l'ASCII ressemble à ceci:
Tous les octets sont connus ici en sécurité octets, donc il y a très peu de chance que tout système corrompu ce message. Je peux envoyer ceci à la place de mon message d'origine et de laisser le récepteur inverser le processus pour récupérer le message d'origine.
Codage binaire des données en XML
Supposons que vous souhaitez incorporer un couple d'images dans un document XML. Les images sont des données binaires, alors que le document XML est texte. Mais XML ne peut pas gérer intégré des données binaires. Alors, comment faites-vous?
Une option consiste à coder les images en base64, en tournant les données binaires en texte XML peut gérer.
Au lieu de:
vous n':
Et de l'analyseur XML être en mesure d'analyser le document XML correctement et d'en extraire les données d'image.
.mht
œuvres en format html (fichier + images dans un seul fichier).Pourquoi ne pas chercher à le RFC définit actuellement en Base64?
Base64 a été initialement conçu comme un moyen de permettre à des données binaires à être attachés aux e-mails en tant que partie de la Multipurpose Internet Mail Extensions.
Médias qui est conçu pour des données textuelles est bien sûr finalement binaire, mais textuelles médias souvent l'utilisation de certaines valeurs binaires pour les caractères de contrôle. Aussi, textuelles médias peut rejeter certaines valeurs binaires non-texte.
De l'encodage Base64 encode des données binaires comme des valeurs qui ne peuvent être interprétés comme un texte textuelle des médias, et il est libre de tous les caractères spéciaux et/ou des caractères de contrôle, de sorte que les données seront conservées dans textuelles médias.
C'est plus que les médias valide le codage de la chaîne, donc nous voulons nous assurer que les données sont acceptables par une manipulation de l'application (et ne pas contenir une séquence binaire représentant en fin de vie par exemple)
Imaginez que vous souhaitez envoyer des données binaires dans un e-mail avec le codage UTF-8 -- L'e-mail peut ne pas s'afficher correctement si le flux de uns et de zéros crée un séquence qui n'est pas valide Unicode en UTF-8.
Le même type de chose qui se passe dans l'Url lorsque l'on veut coder des caractères non valides pour une URL dans l'URL elle-même:
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 de s'assurer qu'il existe une 1-de-1 mappage entre un bon, acceptable et non préjudiciable de la séquence de bits à un autre littérale de la séquence de bits, et que la manipulation de l'application ne fait pas la distinction l'encodage.
Dans votre exemple,
man
peut être valable ASCII en première forme; mais souvent, vous aurez besoin de transmettre des valeurs qui sont binaire aléatoire (c'est à dire l'envoi d'une image dans un e-mail):Ici, nous voyons qu'une image GIF est encodé en base64 un morceau d'un e-mail. Le client de messagerie lit les en-têtes et le décode. En raison de l'encodage, on peut être sûr que le GIF ne contiennent pas tout ce qui peut être interprété comme le protocole et nous éviter l'insertion de données SMTP ou POP peut trouver significative.
Un exemple de quand je l'ai trouvé pratique était lorsque vous essayez d' intégrer des données binaires en XML. Certaines des données binaires a été interprétés par l'analyseur SAX parce que les données peuvent être littéralement n'importe quoi, y compris XML caractères spéciaux. Le codage Base64 les données sur la fin de transmission et de décodage sur la fin de réception résolu le problème.
Base64 au lieu d'échapper les caractères spéciaux
Je vais vous donner un de très différent, mais l'exemple réel: j'écris du code javascript à exécuter dans un navigateur. Les balises HTML ont des valeurs d'ID, mais il y a des contraintes sur les caractères valides dans un ID.
Mais je veux que mon ID sans perte reportez-vous aux fichiers dans mon système de fichiers. Les fichiers dans la réalité peuvent avoir toutes sortes d'étranges et merveilleux de caractères à partir de points d'exclamation, les caractères accentués, tilde, même emoji! Je ne peux pas faire ceci:
Suppose que j'ai besoin d'exécuter du code comme ceci:
Je pense que ce code va échouer lors de l'exécution.
Avec Base64 je peux vous référer à quelque chose de compliqué, sans se soucier de la langue qui permet à ce que les caractères spéciaux et qui ont besoin d'échappement:
Contrairement à l'utilisation d'un MD5 ou une autre fonction de hachage, vous pouvez inverser l'encodage pour savoir exactement ce que les données ont été que réellement utile.
Je souhaite que je savais à propos de Base64 ans. J'aurais évité de déchirer mes cheveux avec ‘
encodeURIComponent
" etstr.replace(‘\n’,’\\n’)
SSH transfert de texte:
Si vous essayez de transmettre des données complexes sur ssh (par exemple, un dotfile de sorte que vous pouvez obtenir votre shell personnalisations), bonne chance de le faire sans en Base 64. C'est de cette façon que vous feriez avec base 64 (je sais que vous pouvez utiliser SCP, mais ce serait prendre plusieurs commandes qui complique les raccourcis clavier pour sshing dans un serveur):
La plupart des ordinateurs stocker des données de 8 bits format binaire, mais ce n'est pas une exigence. Certaines machines et des supports de transmission ne peut gérer que 7 bits (ou peut-être même moins) à la fois. Ce moyen permettrait d'interpréter le flux dans les multiples de 7 bits, donc si vous étiez à envoyer des données de 8 bits, vous ne recevez pas ce que vous attendez de l'autre côté. En Base 64 est juste une façon de résoudre ce problème: vous encodez les entrées en 6 bits format, envoyez-dessus de la moyenne et de décoder de retour au format 8 bits à la fin de réception.
Que ces protocoles ont été conçus pour manipuler du texte (souvent, seulement anglais texte) au lieu de données binaires (comme .png et .des images jpg).
Mais l'inverse n'est pas vrai. Un protocole conçu pour représenter le texte peut mal traiter des données binaires qui arrive à contenir:
De sorte que vous ne pouvez pas envoyer des données binaires sur un protocole basé sur du texte. Vous êtes limité à la octets qui représentent le non-espace de non-contrôle des caractères ASCII, dont il y a 94. La raison en Base 64 fut choisi que c'est plus rapide de travailler avec des puissances de deux, et de 64 est le plus grand qui fonctionne.
Sur le Web, au moins, pour la plupart ils ont. Une majorité de sites à utiliser l'UTF-8.
Le problème de l'Occident est qu'il y a beaucoup de vieux logiciel qui cul-u-me-s que 1 octet = 1 caractère et ne peut pas travailler avec l'encodage UTF-8.
Le problème est, en Orient leur attachement à encodages comme GB2312 et Shift_JIS.
Et le fait que Microsoft semble avoir toujours pas obtenu d'avoir choisi le mauvais encodage UTF. Si vous souhaitez utiliser l'API Windows ou Microsoft C runtime library, vous êtes limité à UTF-16 ou des paramètres régionaux "ANSI" encodage. De ce fait douloureux pour utiliser l'UTF-8 parce que vous avez à convertir tout le temps.
En plus de l'autre (un peu longue) réponses: même en ignorant les vieux systèmes qui prennent en charge seulement 7 bits ASCII, problèmes de base de la fourniture de données binaires en mode texte sont:
Pourquoi/Comment utiliser le codage Base64?
Base64 est un du binaire à l'encodage du texte schéma d'avoir 75% d'efficacité. Il est utilisé de sorte que, typique des données binaires (images) peut être envoyé en toute sécurité sur l'héritage "pas 8-bit clean" chaînes".
Précédemment dans des réseaux de messagerie (jusqu'au début des années 1990), la plupart des e-mail des messages en texte brut dans les 7 bits de caractères US-ASCII. Donc, de nombreuses début de protocole de communication normes ont été conçues pour fonctionner sur les "7 bits" comm liens "pas 8-bit clean".
Schéma de 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 de binaire-codage de texte régime avec 50% d'efficacité.
De L'Encodage Base64 Étapes (Simplifié):
Retour dans la journée quand ASCII régné sur le monde traitant de la non-valeurs ASCII est un mal de tête. Les gens sauté à travers toutes sortes de cerceaux pour obtenir ces transférées sur le fil sans perdre de l'information.