Base64

Résolu
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009 - 25 juin 2007 à 12:08
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 27 juin 2007 à 19:49
Hello
Je cherche a implémenter ma propre fonction de codage/décodage en base64.
J'ai trouvé pas mal de codes ainsi que des articles traitant du sujet mais j'ai du mal a comprendre le principe.
Je sais qu'il faut réunir 3 octets en 4 groupes de 6 bits, qu'on applique un masque binaire 0x3f afin de ne garder que 6 bits. Ce qui me parait bizarre, c'est que dans quasi tous les codes que j'ai pu voir, ils effectuaient des décalages de bits (<< >>) de 2 ou 4 rangs.

Si quelqu'un pouvait me filer un coup de paluche, sa serait top.

PS : je tiens à ne pas utiliser de libs mais bel et bien a développer ma fonction.

Merci

8 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
26 juin 2007 à 05:44
Salut,

jean84> comme tu l'a dis, chaque paquet de 3 octets de données et
découpé en 4 paquets de 6 bits, et chaque petit paquet de 6 bits
represente un index dans un tableau de 64 chars (voir la rfc pour
savoir lesquels).

Concretement au niveau des shifts et des masques, tu va tomber sur 4 cas pour extraire tes index de 6 bits:

- recuperer les 6 bits haut d'un octet,

- recuperer les 2 bits bas d'un octet, et les 4 bits haut d'un autre octet, et les assembler,

- recuperer les 4 bits bas d'un octet, et les 2 bits haut d'un autre octet, et les assembler,

- recuperer les 6 bits bas d'un octet.

il faut donc reflechir a chaque cas avant de te lancer dans la fonction d'encodage.
3
acx01b Messages postés 280 Date d'inscription dimanche 7 septembre 2003 Statut Membre Dernière intervention 8 juillet 2014 6
25 juin 2007 à 13:27
salut

qu'est-ce que tu veux faire exactement ?

donne nous le prototype de ta fonction (ce qu'elle est censée faire, tu veux juste les afficher ?) car les nombres en bases 64 c'est codé pareil que les nombres en base 2 dans l'ordinateur, donc je vois pas trop l'histoire d'encodage décodage !
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
25 juin 2007 à 15:08
acx01b > c'est l'encodage MIME de la RFC1113.

ciao...
BruNews, MVP VC++
0
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
27 juin 2007 à 07:42
acx01b > comme te l'as montré BruNews, c'est effectivement un encodage MIME

Aardman > effectivement je comprend mieux l'intérêt des masques ainsi que celui des décalages.
A tout hasard, aurais-tu un exemple en langage fonctionnel ?

Un grand merci !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
27 juin 2007 à 12:55
Ah dernière question :
"Concretement au niveau des shifts et des masques, tu va tomber sur 4 cas pour extraire tes index de 6 bits:
- recuperer les 6 bits haut d'un octet,
- [...]"

Une fois que j'ai récupéré mes 6 bits, je dois les décaler pour en faire des bits de poids faible ? D'après ce que j'ai pu lire, s'en m'a a tout l'air.... Tu peut confirmer ?

Merci
0
cs_jean84 Messages postés 449 Date d'inscription jeudi 26 août 2004 Statut Membre Dernière intervention 5 mars 2009
27 juin 2007 à 13:16
Bon je sais je fait un peu le boulay mais j'aurais une dernière question (désolé :'( ). Voila mon code (pas grand chose de différent au final avec les autres codes que j'ai pu voir):


unsigned char cIn[3];
unsigned char cOut[4];

char cArray[] = {
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'};

/* Copie 3 octets */
memcpy(cIn, pcBuff, 3);

/* On recupere les 6 premiers bits et on les place en bits de poids faible */
cOut[0] = ((cIn[0] & 0xfc) >> 2);

/* On recupere ensuite les 2 bits restans + les 4 premiers bits de la case suivante */
cOut[1] = ((cIn[0] & 0x03) << 4) | ((cIn[1] & 0xf0) >> 4);

/* On recupere les 4 bits restant de l'octet en cours plus les 2 premiers bits de l'octet suivant */
cOut[2] = ((cIn[1] & 0x0F) << 2) | ((cIn[2] & 0xf0) >> 6);

/* On recupere les 6 derniers bits du dernier octet */
cOut[3] = (cIn[2] & 0x3f);

Ma question est en fait liée au cas où il n'y ai pas un multiple de 24 bits. Je sais qu'il faut rajouter des '=' mais wikipedia n'est pas super explicite à ce sujet ou plutôt je ne comprend pas trop...
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 4
27 juin 2007 à 17:36
Salut,

Dans mon post d'avant j'ai noté que chaque paquet de 6 bits etait un
index dans ton tableau cArray, et donc, pour cOut[0] ca donnerait:

cOut[0] = cArray[cIn[0] >> 2];

j'ai enlevé le masque aussi, il ne sert pas a grand chose dans ce cas la.

Reste a faire pareil pour les autres cas, et a tester.


Pour les '=':

Si tes données ne sont pas un multiple de 3 octets, tu peux te retrouver avec un dernier paquet qui fait 2 ou 4 bits.

Dans ce cas la, il faut l'encoder en completant les bits manquant par
des bits a zéro, et rajouter un ou deux '=', suivant le nombre de bits
a 0 que tu as rajouté.
0
BruNews Messages postés 21041 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 19
27 juin 2007 à 19:49
Je viens de faire un exemple:
http://www.cppfrance.com/code.aspx?ID=43268

ciao...
BruNews, MVP VC++
0