BASE64 DECODAGE

Mikey_md Messages postés 33 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 2 février 2014 - 21 juin 2005 à 21:21
cbonafos Messages postés 1 Date d'inscription mardi 14 mars 2006 Statut Membre Dernière intervention 14 mars 2006 - 14 mars 2006 à 10:41
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32221-base64-decodage

cbonafos Messages postés 1 Date d'inscription mardi 14 mars 2006 Statut Membre Dernière intervention 14 mars 2006
14 mars 2006 à 10:41
Hassine, tu écris comme explication finale :
" ...je veux remercier celui qui a fait cette source à l'origine, j'ai essayé de retrouver son auteur mais g pas réussi..."

Donc, pour ton information, l'auteur du code original de ta fonction de nomme Antonin Foller et le source origianl peut être trouvé à :
http://www.motobit.com/tips/detpg_Base64/

Il commence comme suit :

' Decodes a base-64 encoded string (BSTR type).
' 1999 - 2004 Antonin Foller, http://www.motobit.com
' 1.01 - solves problem with Access And 'Compare Database' (InStr)
Function Base64Decode(ByVal base64String)
'rfc1521
'1999 Antonin Foller, Motobit Software, http://Motobit.cz
jlassira05 Messages postés 28 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juillet 2005
6 juil. 2005 à 15:09
merci infiniement...c'est vraiement mon soucis actuel de tranformer la chaine en base64 ( US ASCII quoi ! )
amine_hassini Messages postés 23 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 avril 2007
6 juil. 2005 à 15:05
Je ne travaille pas avec le codage c'est le décodage qui m'interesse donc je vais essayer de créer la fonction inversion et je la posterai le plus vite possible promis!
jlassira05 Messages postés 28 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juillet 2005
6 juil. 2005 à 11:29
Pouuriez vous m'aider s 'il vous plait ...tout ce que je veux faire c 'est convertir une chaine de caracteres de longuer variable en une autre chaine en base64 pour pouvoir l'analyser selon un autre traitement ensuite !

je suis vraiement coincé !

merci
jlassira05 Messages postés 28 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juillet 2005
6 juil. 2005 à 11:19
Je viens de tester la fonction mais ca ne marche pas !! j'arrive pas a convertir ma chaine de caractere ...une erreur vbscript est affiche :
Microsoft VBScript runtime (0x800A000D)
Type mismatch: 'MyASC'
/cyb8_v2/entete/entete.asp, line 147
jlassira05 Messages postés 28 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juillet 2005
6 juil. 2005 à 11:13
je n'arrive pas toujours a convertir avec la fonction que vous m'avez suggérer... j 'ai un probleme avec al fonction MyAsc qui est apparamment inconnue
jlassira05 Messages postés 28 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juillet 2005
6 juil. 2005 à 11:05
Je viens de tester la fonction mais ca ne marche pas !! j'arrive pas a convertir ma chaine de caractere ...une erreur vbscript est affiche :
Microsoft VBScript runtime (0x800A000D)
Type mismatch: 'MyASC'
/cyb8_v2/entete/entete.asp, line 147
jlassira05 Messages postés 28 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juillet 2005
5 juil. 2005 à 17:06
pourrais tu m'aider encore mieux en me localisant stp la partie qui pourrait vraiement m'aider !! et encore merci d'avance
amine_hassini Messages postés 23 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 avril 2007
5 juil. 2005 à 16:55
pour l'encodage tu fais l'opération inverse de ce que je fais à savoir regrouper chaque groupe de 3 caractère et l'encoder sur 4 (6 bit).
sinon si tu n'a pas le temps tu trouvera une fonction toute faite dans le module de ce projet: http://www.vbfrance.com/code.aspx?id=3314
Si tu as des problème avec les caracteres speciaux en français le codage base64 te permettra sans doute de l'eliminer puisque tt les caractère utilisé sont ceux de l'US-ASCII.
j'espère que j'ai répondu à ta question.
jlassira05 Messages postés 28 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 6 juillet 2005
5 juil. 2005 à 16:17
j'ai un probleme d'analyse de flux xml ..j'ai pu localiser le probleme ..en effet certains caracteres speciaux en français qui causent l'erreur du chargement du flux xml ( dans mon cas le resultat d'une requete sql a un serveur sql server) ...alors on m'a dit qu'il serait preferable d'encoder le resultat en base64...est ce que vous pouvez me dire comment le faire ? sachant que j'utilise vbscript dans mes pages asp!! et surtout en quoi cet encodage pourrait resoudre le proobleme?

merci
Egyde Messages postés 158 Date d'inscription lundi 17 mai 2004 Statut Membre Dernière intervention 16 juillet 2007
23 juin 2005 à 10:57
A propos de la concaténation de la chaîne sOut...

Puisque la longueur de la chaîne décodée vaut :
n = 3*(dataLength/4), il te suffit de définir un tableau de Byte de cette dimension pour ensuite y transférer caractère par caractère pOut. En fin de fonction, tu utilises StrConv par exemple pr convertir ton tableau de Byte en String.
Egyde Messages postés 158 Date d'inscription lundi 17 mai 2004 Statut Membre Dernière intervention 16 juillet 2007
23 juin 2005 à 10:45
Puisque chaque quadruplet codé est associé à un seul triplet décodé, ta table de correspondance sera de la forme :

T : c1|c2|c3|c4 = p1|p2|p3

Ici, T est un tableau à 4 dimensions paramétré par les caractères codés ci. Pour décoder ton fichier, tu lis simplement dans le tableau T les caractères décodés (p1,p2,p3) indéxé par le quadruplet (c1,c2,c3,c4)

Note bien que LE PRE-CALCUL N'EST UTILE QUE SI LE NOMBRE DE DONNEES A CODER/DECODER EST CONSEQUENT. En effet, l'espace mémoire nécessaire pr cette méthode est de l'ordre de 3*64^4 octets si je me trompe pas, soit dans les 50Mo. Si ton volume de données est inférieur, c peut-être pas judicieux, même si le gain en terme de vitesse est évident.
gmoz22 Messages postés 10 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 5 août 2005
23 juin 2005 à 10:29
Ok Amine, je te crois.
En tout cas, la fonction de base marche en VBS.

Merci.
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
22 juin 2005 à 21:43
OK... maintenant je comprends nettement mieux!!! En effet, j'étais loin de cette idée là... moi je pensais déjà stéganographie et autres jeux de "compression" binaire... pfuu... Merci pour toutes ces précision!!!
Bonne continuation
Enjoy
amine_hassini Messages postés 23 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 avril 2007
22 juin 2005 à 21:40
j'aimerais plus de précision à propos de ta méthode EGYDE ça m'aiderait enormément. merci d'avance
amine_hassini Messages postés 23 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 avril 2007
22 juin 2005 à 21:38
au contraire il n ya pas de compression la taille augmente de 33% mais ce type de codage est utilisé pour "contourner" une contrainte imposée par les serveur de messagerie qui n'accepte pas de faire passer n'importe quel type de données. une deuxième raison c'est qu'au début les emails étaient faits à l'origine pour envoyer du texte pure (US-ASCII plus précisement) donc il a fallut trouver une méthode pour envoyé les autres types de données pour qu'il puisse passer à travers tt les types de serveurs de messagerie même les vieux d'entre eux
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
22 juin 2005 à 21:31
Mais ce que je comprends pas c'est si on a de la compression ou pas !?!? Non je suppose... mais alors dans ce cas, l'intérêt est ultra limité non !?!?
Egyde Messages postés 158 Date d'inscription lundi 17 mai 2004 Statut Membre Dernière intervention 16 juillet 2007
22 juin 2005 à 21:18
Pour avoir déjà travaillé avec du BaseN, je peux te donner quelques conseils pour optimiser ton code :

- Tout d'abord, si vraiment tu as des grosses données à coder/décoder, il est préférable de précalculer tous les couples plaintext/ciphertext (tu crée une table de correspondance 4 octects -> 3 octets), ce qui évite d'avoir à recalculer 10 fois la meme chose si une même séquence est présente plusieurs fois.

- Ensuite, plutôt que de concaténer la chaine sOut, tu ferais mieux d'initialiser l'espace mémoire nécessaire d'un tableau de Byte pour ensuite y transférer les triplets du fichier décoder. Tu verras, le temps d'exécution n'a plus rien de comparable...

----
Juste pour préciser les choses, l'intérêt du Base64 est de remplacer n'importe quel séquence binaire en une suite de caractères imprimables puisque la table de conversion ne fait intervenir que des chiffres et des lettres. Résultat : vous pouvez 'imprimer' un fichier .exe par exemple, détecter à l'oeil une erreur de transfert, etc. C'est un algo qui s'est répandu avec le format MIME (envoi de mail comme la déjà dit amine_hassini)
amine_hassini Messages postés 23 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 avril 2007
22 juin 2005 à 16:30
pour ce qui est des commentaires j'essairai d'en rajouter.
amine_hassini Messages postés 23 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 avril 2007
22 juin 2005 à 16:27
Je répondrais d'abords à Gmoz22, le fonction que tu propose est celle que j'utilisais à l'origine (remarque que j'utilise le même nom de variables) et c'est elle aussi qui devient super lente quand on veut décoder des fichiers de plus de 1MO fais l'essais toi même et tu verras le différence.
gmoz22 Messages postés 10 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 5 août 2005
22 juin 2005 à 16:20
Je propose un alternatif a ton code.
C'est une fonction que j'utilise en VBS.

Function Base64Decode(base64String)
' RFC 1521
Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim dataLength, sOut, groupBegin

' virer les espaces, si necessaire
base64String = Replace(base64String, vbCrLf, "")
base64String = Replace(base64String, vbTab, "")
base64String = Replace(base64String, " ", "")

' La source doit etre des groupes de 4 caracteres
dataLength = Len(base64String)
If dataLength Mod 4 <> 0 Then
Err.Raise 1, "Base64Decode", "Bad Base64 string."
Exit Function
End If

' Decodage de chaque groupe:
For groupBegin = 1 To dataLength Step 4
Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
' Chaque groupe est encoder en 3 bits reels.
numDataBytes = 3
nGroup = 0

For CharCounter = 0 To 3
' Convertir chaque caractere en 6 bits de donnees, et ajouter a
' un entier dans espace temporaire. Si le caractere est '=',
' il y a un bit de donnee en moins. (Il ne peut y avoir que 2 '='
' dans tout le string.)

thisChar = Mid(base64String, groupBegin + CharCounter, 1)

If thisChar = "=" Then
numDataBytes = numDataBytes - 1
thisData = 0
Else
thisData = InStr(1, Base64, thisChar, vbBinaryCompare) - 1
End If
If thisData = -1 Then
Err.Raise 2, "Base64Decode", "Bad character In Base64 string."
Exit Function
End If

nGroup = 64 * nGroup + thisData
Next

' Hex divise le Long en 6 groupes de 4 bits
nGroup = Hex(nGroup)

' Ajout des zeros du debut
nGroup = String(6 - Len(nGroup), "0") & nGroup

' Convertir l'entier hex de 3 bits (6 cars.) en 3 caracters
pOut = Chr(CByte("&H" & Mid(nGroup, 1, 2))) + _
Chr(CByte("&H" & Mid(nGroup, 3, 2))) + _
Chr(CByte("&H" & Mid(nGroup, 5, 2)))

' Ajouter numDataBytes de caracters au string de sortie
sOut = sOut & Left(pOut, numDataBytes)
Next

Base64Decode = sOut
End Function
yan35 Messages postés 185 Date d'inscription dimanche 29 juin 2003 Statut Membre Dernière intervention 20 juin 2013
22 juin 2005 à 12:30
Bonjour,

Interessante l'idée de gagner du temps dans ce decodage base64, mais peux-tu nous expliquer comment tu fais gagner du temps ?
Merci
ScSami Messages postés 1488 Date d'inscription mercredi 5 février 2003 Statut Membre Dernière intervention 3 décembre 2007 24
22 juin 2005 à 09:02
Ca manque un peu de commentaire vous ne trouvez pas !?!?!?
Non mais parce que moi qui ne connait pas non plus ce qu'est cette technique, ben meme avec tes explications Amine, je comprends toujours pas super bien... Alors, si tu pouvais être plus précis dans l'explication de la méthode et de son but, ce serait super bien, merci :-)

Sinon, y'a quand même des trucs qui vont pas dans ce code!!! Comme par exemple :

# ReDim amine(dataLength / 4)
#
# For i = 0 To (dataLength / 4) - 1
# amine(i) = Mid(base64String, (i * 4) + 1, 4)
# Next i
# ' Decodage de chaque groupe:
# kk = UBound(amine)
#
# For groupBegin = 0 To kk - 1

Que je propose de le remplacer par ceci :

# ReDim amine(dataLength / 4)
#
# kk = UBound(amine) - 1
#
# For i = 0 To kk
# amine(i) = Mid(base64String, (i * 4) + 1, 4)
# Next i
# ' Decodage de chaque groupe:
#
# For groupBegin = 0 To kk

Vous ne croyez pas ?!?!?!?

Bon, ben sur ce, j'attends tes explications détaillées avec une immense impatience... (juste un truc, dis moi, c'est pas un peu comme avec la stéganographie ???)

Enjoy
amine_hassini Messages postés 23 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 avril 2007
22 juin 2005 à 02:24
je suis intéressé de savoir ce qui va pas avec le gettickcount! et aussi ce qui va pas avec le résultat!!! je travaille sur un programme qui lie les .dbx que je compte bientôt publier, et ça m'aiderais bcp ke qlq1 explique ce ki ne vas pas avec mon code ça m'évitera de passer encore du temps sur ça!!!
amine_hassini Messages postés 23 Date d'inscription mardi 19 octobre 2004 Statut Membre Dernière intervention 16 avril 2007
22 juin 2005 à 02:19
le base64 est c'est une façon d'encoder des donnée sur 6 bit c'est à dire en utilisant juste les caractère US-ASCII et c utilisé surtout pour l'envoi des fichiers attachés sur mail qui n'était pas précu au début pour l'envoi des données pareils.
Jebha Messages postés 2 Date d'inscription jeudi 9 juin 2005 Statut Membre Dernière intervention 22 juin 2005
22 juin 2005 à 02:14
le gain est énorme il faut essayer avec un fichier de plus 1Mo et tu verra la différence de 12min à environ une vingtaine de seconde!!!!
Jean_Elens Messages postés 53 Date d'inscription dimanche 29 mai 2005 Statut Membre Dernière intervention 16 octobre 2006
21 juin 2005 à 22:02
Dommage pour le gettickcount, le zout et sout... Ils minent le resultat et ne donnent donc pas le resultat escompté du decodage ! Bravo à l'auteur de la fonction de depart ! Bravo au soldat inconnu! Je lui aurait mis 20/10. Ici je ne note pas.
Mikey_md Messages postés 33 Date d'inscription dimanche 10 octobre 2004 Statut Membre Dernière intervention 2 février 2014
21 juin 2005 à 21:21
pour info, c'est quoi la base 64?c'est utiliser pour quoi?
Rejoignez-nous