Pourquoi ne l'encodage base64 exiger remplissage si l'entrée de la longueur n'est pas divisible par 3?
Quel est le but de rembourrage dans le codage base64. Ce qui suit est l'extrait de wikipedia:
"Un pad supplémentaire personnage est alloué qui peut être utilisé pour forcer la sortie encodé en un entier multiple de 4 caractères (ou de manière équivalente la forme non codée binaire texte n'est pas un multiple de 3 octets) ; ces caractères de remplissage doit ensuite être jetés lors du décodage, mais encore de permettre le calcul de la longueur effective de la forme non codée texte, lors de son entrée binaire de longueur ne serait pas un multiple de 3 octets (le dernier non-caractère de remplissage est normalement codée de telle sorte que les 6 derniers bits du bloc qu'il représente est complété par des zéros sur ses bits de poids faible, pas plus de deux pavé de caractères peut se produire à la fin de l'encodage du flux)."
J'ai écrit un programme qui pourrait base64 encode une chaîne et de décoder n'importe quel chaîne encodée en base64. Ce problème ne rembourrage en résout?
Vous devez vous connecter pour publier un commentaire.
Votre conclusion que le rembourrage est inutile est à droite. Il est toujours possible de déterminer la longueur de l'entrée sans ambiguïté de la longueur de la séquence encodée.
Cependant, le rembourrage est utile dans les situations où les chaînes codées en base64 sont concaténées de telle sorte que les longueurs des séquences individuelles sont perdus, comme cela pourrait se produire, par exemple, dans un très simple de protocole de réseau.
Si unpadded chaînes sont concaténées, il est impossible de récupérer les données d'origine parce que les informations sur le nombre impair d'octets à la fin de chaque séquence est perdu. Toutefois, si le collier de séquences sont utilisés, il n'y a pas d'ambiguïté, et la séquence dans son ensemble peut être décodé correctement.
Edit: Une Illustration
Supposons que nous avons un programme qui base64 encode les mots, les concatène et les envoie sur un réseau. Il encode "je", "AM" et "TJM", les sandwiches, les résultats d'ensemble sans rembourrage et les transmet.
I
codeSQ
(SQ==
avec un rembourrage)AM
codeQU0
(QU0=
avec un rembourrage)TJM
codeVEpN
(VEpN
avec un rembourrage)Si les données transmises sont
SQQU0VEpN
. Le récepteur base64 décode ce queI\x04\x14\xd1Q)
au lieu de laIAMTJM
. Le résultat est un non-sens parce que l'expéditeur a détruit des informations sur l'endroit où chaque mot se termine dans la séquence encodée. Si l'expéditeur a envoyéSQ==QU0=VEpN
au lieu de cela, le récepteur pourrait avoir décodé ce que trois base64 séquences qui serait concaténer pour donnerIAMTJM
.Pourquoi s'Embêter avec un Rembourrage?
Pourquoi ne pas concevoir le protocole de préfixe de chaque mot avec un nombre entier de longueur? Ensuite, le récepteur peut décoder le flux de données correctement et il n'y aurait pas besoin de rembourrage.
C'est une excellente idée, tant que nous savoir la longueur des données, nous sommes d'encodage avant de commencer l'encodage. Mais si, au lieu de mots, nous avons été encodage des morceaux de vidéo à partir d'un live de la caméra? Nous pourrions ne pas connaître la longueur de chaque bloc à l'avance.
Si le protocole utilisé rembourrage, il n'y aurait pas besoin de transmettre une longueur à tous. Les données peuvent être codées comme il est venu de la caméra, chaque morceau est arrêté avec rembourrage, et le récepteur serait en mesure de décoder le flux de données correctement.
Évidemment c'est un exemple artificiel, mais peut-être cela explique pourquoi rembourrage pourrait être utile dans certaines situations.
Quels sont les Caractères de Remplissage?
Les caractères de remplissage aider à satisfaire les exigences de longueur et de transporter aucun sens.
Décimal Exemple de Rembourrage:
Compte tenu de l'arbitraire exigence de toutes les chaînes de caractères 8 caractères, le nombre de 640 peut répondre à cette exigence précédant le 0 comme les caractères de remplissage comme ils ne portent aucun sens, "00000640".
Codage Binaire
L'Octet de Paradigme: L'octet est la norme de facto unité de mesure et de tout schéma de codage doit relier octets.
Base256 s'inscrit exactement dans ce paradigme. Un octet est égal à un personnage dans base256.
Base16, hexadécimal ou hex, utilise 4 bits pour chaque caractère. Un octet peut représenter deux base16 caractères.
Base64 ne correspond pas de manière uniforme dans l'octet de paradigme, à la différence de base256 et base16. Tous les base64 caractères peuvent être représentés dans les 6 bits, 2 bits court plein d'un octet.
Nous pouvons représenter l'encodage base64 rapport à l'octet paradigme comme une fraction: 6 bits par caractère sur 8 bits par octet. Réduit cette fraction est de 3 octets de plus de 4 caractères.
Ce ratio, 3 octets pour chaque 4 base64 caractères, est la règle que nous voulons suivre lors de l'encodage en base64. De l'encodage Base64 ne peut promettre de même de se mesurer avec 3 octets faisceaux, à la différence de base16 et base256 où chaque octet peut se tenir debout sur ses propres.
Donc pourquoi est rembourrage encouragé, même si l'encodage pourrait très bien fonctionner sans les caractères de remplissage? Les caractères de remplissage de communiquer de manière explicite que ces places supplémentaires devraient être vide, et exclut toute ambiguïté ou potentiellement méchants bugs. Rembourrage nous permet de décoder le codage base64 avec la promesse de ne perdu bits. Sans rembourrage, il n'est plus la reconnaissance explicite de la mesure en trois octets faisceaux et nous ne pouvons plus garantir la reproduction exacte de l'original de l'encodage sans informations supplémentaires.
Exemples
Voici le formulaire de l'exemple de la RFC 4648 (http://tools.ietf.org/html/rfc4648#section-8)
Chaque caractère à l'intérieur de la "BASE64" fonction utilise un octet (base256). Nous avons ensuite le traduire en base64.
Voici un codeur qui vous permettent de jouer avec: http://www.motobit.com/util/base64-decoder-encoder.asp
char*
, vous avez besoin de la taille de la chaîne ou un terminateur null. Rembourrage est redondante. Par conséquent, OP question.Ce n'est qu'une théorie de la mienne, et je ne peut pas fournir des sources, mais je pense que le rembourrage personnage(s) qui ne servent qu'à faire certaines implémentations de l'algorithme de décodage d'un moindre peu plus simple. En particulier, si l'algorithme met la chaîne codée en quelque chose comme
int[]
alors la valeur finale sera parfois trop long.Si le rembourrage est déjà présent dans l'entrée puis rien d'autre qu'il faut faire, l'algorithme peut juste lire et décoder l'entrée.
Si l'algorithme n'est pas permis de supposer que le rembourrage à l'heure actuelle, cependant, et il utilise
int[]
-comme discbased, puis il doit manuellement pad de la finale entier avant de décodage, ou une comptabilité d'entrée de la longueur d'origine.Personnellement, je ne pense pas que le rembourrage sert à quelque fin que ce soit, mais de retour quand le CPU et la RAM n'étaient pas aussi nombreux que maintenant cette légère optimisation peut avoir d'importance. Je doute qu'il importait que très bien... une bonne mise en œuvre aura toujours besoin de faire quelque chose de raisonnable, lorsque l'on nourri d'entrée qui a été tronqué au hasard, et que, de l'OMI, serait de donner la possibilité aux processus unpadded entrées à aucun coût supplémentaire.
b'Zm9vYmFyZm9vYg==' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy' b'Zm9vYmFyZm9vYmFyZg==' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v'
est la même que celle deb'Zm9vYmFyZm9vYg=' b'Zm9vYmFyZm9vYmE=' b'Zm9vYmFyZm9vYmFy=' b'Zm9vYmFyZm9vYmFyZg=' b'Zm9vYmFyZm9vYmFyZm8=' b'Zm9vYmFyZm9vYmFyZm9v='