Est-il possible de coder en base64 un fichier en morceaux?
Je suis en train d'encoder en base64 un énorme fichier d'entrée et jusqu'à la fin avec un fichier texte de sortie, et j'essaie de savoir si il est possible d'encoder le fichier d'entrée bit-par-bit, ou si j'en ai besoin pour coder la chose entière à la fois.
Cela sera fait sur l'as/400 (iSeries), si cela fait une différence. Je suis avec mon propre encodage base64 routine (écrit en RPG) qui fonctionne très bien, et s'il ne s'agit pas de limitations sur la taille, ce serait bien.
source d'informationauteur roryhewitt
Vous devez vous connecter pour publier un commentaire.
Il n'est pas possible bit-par-bit mais 3 octets à la fois, ou des multiples de 3 octets à temps fera!.
En d'autres termes, si vous divisez votre fichier d'entrée en "morceaux", dont la taille(s) est (sont) les multiples de 3 octets, vous pouvez encoder les morceaux séparément et de les assembler la résultante B64-codé ensemble de pièces (dans l'orde, bien sûr. Notez que la dernière chuink n'a pas besoin d'être exactement un multiple de 3 octets la taille, selon le modulo 3 de la valeur de sa taille de son correspondant B64 valeur aurez quelques-uns de ces caractères de remplissage (généralement le signe égal) mais c'est ok, comme thiswill être la seule pièce qui a (et les besoins) tels rembourrage.
Dans le décodage de la direction, c'est la même idée, sauf que vous avez besoin de partager la B64-données codées dans des multiples de 4 octets. Décoder en parallèle, individuellement comme vous le souhaitez et re-pièce, les données d'origine en ajoutant le décodé les pièces ensemble (à nouveau dans le même ordre).
Exemple:
"Fichier" contenu =
"Never argue with the data." (Jimmy Neutron)
.Droite encoding =
Ik5ldmVyIGFyZ3VlIHdpdGggdGhlIGRhdGEuIiAoSmltbXkgTmV1dHJvbik=
Maintenant, en morceaux:
"Never argue
-->Ik5ldmVyIGFyZ3Vl
with the
-->IHdpdGggdGhl
data." (Jimmy Neutron)
-->IGRhdGEuIiAoSmltbXkgTmV1dHJvbik=
Comme vous le voyez morceau dans l'ordre les 3 morceaux encodés montant le même que le code produit pour l'ensemble du fichier.
Le décodage est fait de la même manière, avec arbitraires chuncked de taille à condition qu'ils soient des multiples de 4 octets. Il n'y a absolument pas besoin d'avoir tout type de correspondance entre les tailles utilisé pour l'encodage. (bien que la normalisation d'une taille unique pour chaque direction (disons 300 et 400) peut rend les choses plus uniforme et plus facile à gérer.
Il est trivial d'effort pour diviser tout bytestream en morceaux.
Vous pouvez base64 tout fragment d'octets sans problème.
Le problème auquel vous êtes confronté à est que si vous placez des exigences spécifiques sur votre morceaux (multiples de 3 octets), la séquence de codage base64 morceaux sera différent de celui de la sortie réelle que vous voulez.
En C#, c'est un (bâclée), vous pourriez vous faire langoureusement. L'exécution est en fait reporté jusqu'à la corde.Concat est appelé, de sorte que vous pouvez faire ce que vous voulez avec les fragments de chaînes. (Si vous le brancher dans LINQPad vous verrez le résultat)
Sortie
Hmmm, si vous avez écrit le base64 conversion vous-même, vous devriez avoir remarqué la chose la plus évidente: chaque séquence de 3 octets est représenté par 4 caractères en base64.
De sorte que vous pouvez séparer les données base64 à chaque multiple de quatre personnages, et il sera possible de convertir ces morceaux à leur valeur d'origine bits.
Je ne sais pas comment fichiers de personnage et de l'octet les fichiers sont traités sur un as/400, mais si il a les deux concepts, ce devrait être très facile.
Si vous pouvez répondre à toutes ces questions, ce exact des difficultés avez-vous quitté?