Mikey_md
Messages postés33Date d'inscriptiondimanche 10 octobre 2004StatutMembreDernière intervention 2 février 2014
-
21 juin 2005 à 21:21
cbonafos
Messages postés1Date d'inscriptionmardi 14 mars 2006StatutMembreDernière intervention14 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.
cbonafos
Messages postés1Date d'inscriptionmardi 14 mars 2006StatutMembreDernière intervention14 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és28Date d'inscriptionjeudi 9 juin 2005StatutMembreDerniè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és23Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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és28Date d'inscriptionjeudi 9 juin 2005StatutMembreDerniè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és28Date d'inscriptionjeudi 9 juin 2005StatutMembreDerniè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és28Date d'inscriptionjeudi 9 juin 2005StatutMembreDerniè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és28Date d'inscriptionjeudi 9 juin 2005StatutMembreDerniè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és28Date d'inscriptionjeudi 9 juin 2005StatutMembreDerniè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és23Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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és28Date d'inscriptionjeudi 9 juin 2005StatutMembreDerniè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és158Date d'inscriptionlundi 17 mai 2004StatutMembreDernière intervention16 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és158Date d'inscriptionlundi 17 mai 2004StatutMembreDernière intervention16 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és10Date d'inscriptionmardi 11 juin 2002StatutMembreDerniè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és1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 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és23Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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és23Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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és1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 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és158Date d'inscriptionlundi 17 mai 2004StatutMembreDernière intervention16 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és23Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 avril 2007 22 juin 2005 à 16:30
pour ce qui est des commentaires j'essairai d'en rajouter.
amine_hassini
Messages postés23Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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és10Date d'inscriptionmardi 11 juin 2002StatutMembreDerniè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
' 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.)
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
' Ajouter numDataBytes de caracters au string de sortie
sOut = sOut & Left(pOut, numDataBytes)
Next
Base64Decode = sOut
End Function
yan35
Messages postés185Date d'inscriptiondimanche 29 juin 2003StatutMembreDernière intervention20 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és1488Date d'inscriptionmercredi 5 février 2003StatutMembreDernière intervention 3 décembre 200724 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és23Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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és23Date d'inscriptionmardi 19 octobre 2004StatutMembreDernière intervention16 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és2Date d'inscriptionjeudi 9 juin 2005StatutMembreDernière intervention22 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és53Date d'inscriptiondimanche 29 mai 2005StatutMembreDernière intervention16 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és33Date d'inscriptiondimanche 10 octobre 2004StatutMembreDernière intervention 2 février 2014 21 juin 2005 à 21:21
pour info, c'est quoi la base 64?c'est utiliser pour quoi?
14 mars 2006 à 10:41
" ...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
6 juil. 2005 à 15:09
6 juil. 2005 à 15:05
6 juil. 2005 à 11:29
je suis vraiement coincé !
merci
6 juil. 2005 à 11:19
Microsoft VBScript runtime (0x800A000D)
Type mismatch: 'MyASC'
/cyb8_v2/entete/entete.asp, line 147
6 juil. 2005 à 11:13
6 juil. 2005 à 11:05
Microsoft VBScript runtime (0x800A000D)
Type mismatch: 'MyASC'
/cyb8_v2/entete/entete.asp, line 147
5 juil. 2005 à 17:06
5 juil. 2005 à 16:55
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.
5 juil. 2005 à 16:17
merci
23 juin 2005 à 10:57
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.
23 juin 2005 à 10:45
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.
23 juin 2005 à 10:29
En tout cas, la fonction de base marche en VBS.
Merci.
22 juin 2005 à 21:43
Bonne continuation
Enjoy
22 juin 2005 à 21:40
22 juin 2005 à 21:38
22 juin 2005 à 21:31
22 juin 2005 à 21:18
- 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)
22 juin 2005 à 16:30
22 juin 2005 à 16:27
22 juin 2005 à 16:20
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
22 juin 2005 à 12:30
Interessante l'idée de gagner du temps dans ce decodage base64, mais peux-tu nous expliquer comment tu fais gagner du temps ?
Merci
22 juin 2005 à 09:02
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
22 juin 2005 à 02:24
22 juin 2005 à 02:19
22 juin 2005 à 02:14
21 juin 2005 à 22:02
21 juin 2005 à 21:21