OVH Cloud OVH Cloud

Problème d'encodage en base64

8 réponses
Avatar
Christian
Bonjour,

Je viens d'avoir la mauvaise surprise que mon code d'encodage ne
fonctionnait pas avec de gros fichier texte (8 Mo). J'ai une erreur
Overflow. Cela marche avec des fichiers plus petit mais là ?

Voici mon code :
k= Freefile
Open chemFichier For Binary As #k
sbuff = Space$(LOF(k))
Get #k, , sbuff
Close #k
FichierCode = base64_encode(sbuff)

J'ai essayé de l'encoder ligne par ligne avec line input mais là j'y ai
passé 1 h 30.

Donc comment je peux faire pour pour voir l'encoder sans souci ?

Christian.

8 réponses

Avatar
ng
Salut,

Essaye les fonctions suivantes, qui sont très optimisées :

Public Function Base64Decode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte, Dec(0 To 255)
As Byte
If Len(S) = 0 Then Exit Function
Enc =
StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
For i = 0 To 255: Dec(i) = 64: Next
For i = 0 To 63: Dec(Enc(i)) = i: Next
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve Out(0 To (L 4) * 3 - 1)
For i = 0 To UBound(b) Step 4
Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2)) 4): j = j + 1
Out(j) = (Dec(b(i + 2)) And 3) * 64 Or Dec(b(i + 3)): j = j + 1
Next i
If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1 Else j = 0
ReDim Preserve Out(0 To UBound(Out) - j)
Base64Decode = StrConv(Out, vbUnicode)
End Function


Sinon si t'as des gros fichiers, pour ne pas tout charger et décoder d'un
coup, tu peux en effet procéder par morceau.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Bonjour,

Je viens d'avoir la mauvaise surprise que mon code d'encodage ne
fonctionnait pas avec de gros fichier texte (8 Mo). J'ai une erreur
Overflow. Cela marche avec des fichiers plus petit mais là ?

Voici mon code :
k= Freefile
Open chemFichier For Binary As #k
sbuff = Space$(LOF(k))
Get #k, , sbuff
Close #k
FichierCode = base64_encode(sbuff)

J'ai essayé de l'encoder ligne par ligne avec line input mais là j'y
ai passé 1 h 30.

Donc comment je peux faire pour pour voir l'encoder sans souci ?

Christian.


Avatar
Christian
Salut,

Merci pour la réponse. J'ai testé hier et aujourd'hui mais j'ai toujours la
même chose. J'ai étendu les tests à de petit fichier moins de 300 K et je
rencontre la même chose (avec ta fonction et la mienne). Pourtant comme je
le disais dans mon premier post cela marchait bien, il est que je n'aie pas
eu à l'utiliser depuis plusieurs mois.

Je n'arrive pas à voir d'où cela peut venir.

"ng" a écrit dans le message de news:

Salut,

Essaye les fonctions suivantes, qui sont très optimisées :

Public Function Base64Decode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte, Dec(0 To


255)
As Byte
If Len(S) = 0 Then Exit Function
Enc >


StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
For i = 0 To 255: Dec(i) = 64: Next
For i = 0 To 63: Dec(Enc(i)) = i: Next
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve Out(0 To (L 4) * 3 - 1)
For i = 0 To UBound(b) Step 4
Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2)) 4): j = j +


1
Out(j) = (Dec(b(i + 2)) And 3) * 64 Or Dec(b(i + 3)): j = j + 1
Next i
If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1 Else j 0
ReDim Preserve Out(0 To UBound(Out) - j)
Base64Decode = StrConv(Out, vbUnicode)
End Function


Sinon si t'as des gros fichiers, pour ne pas tout charger et décoder d'un
coup, tu peux en effet procéder par morceau.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
> Bonjour,
>
> Je viens d'avoir la mauvaise surprise que mon code d'encodage ne
> fonctionnait pas avec de gros fichier texte (8 Mo). J'ai une erreur
> Overflow. Cela marche avec des fichiers plus petit mais là ?
>
> Voici mon code :
> k= Freefile
> Open chemFichier For Binary As #k
> sbuff = Space$(LOF(k))
> Get #k, , sbuff
> Close #k
> FichierCode = base64_encode(sbuff)
>
> J'ai essayé de l'encoder ligne par ligne avec line input mais là j'y
> ai passé 1 h 30.
>
> Donc comment je peux faire pour pour voir l'encoder sans souci ?
>
> Christian.




Avatar
ng
Salut,

Pourtant chez moi cette fonction fonctionne parfaitement (et rapidement)
avec des fichiers de plusieurs dizaine de Mo, le problème doit être
ailleurs, peut on voir toute ta routine (déclaration des variables comprise)
?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Salut,

Merci pour la réponse. J'ai testé hier et aujourd'hui mais j'ai
toujours la même chose. J'ai étendu les tests à de petit fichier
moins de 300 K et je rencontre la même chose (avec ta fonction et la
mienne). Pourtant comme je le disais dans mon premier post cela
marchait bien, il est que je n'aie pas eu à l'utiliser depuis
plusieurs mois.

Je n'arrive pas à voir d'où cela peut venir.

"ng" a écrit dans le message de news:

Salut,

Essaye les fonctions suivantes, qui sont très optimisées :

Public Function Base64Decode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte, Dec(0
To 255) As Byte
If Len(S) = 0 Then Exit Function
Enc >>


StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
For i = 0 To 255: Dec(i) = 64: Next
For i = 0 To 63: Dec(Enc(i)) = i: Next
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve Out(0 To (L 4) * 3 - 1)
For i = 0 To UBound(b) Step 4
Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2)) 4): j
= j + 1 Out(j) = (Dec(b(i + 2)) And 3) * 64 Or Dec(b(i + 3)):
j = j + 1 Next i
If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1
Else j = 0 ReDim Preserve Out(0 To UBound(Out) - j)
Base64Decode = StrConv(Out, vbUnicode)
End Function


Sinon si t'as des gros fichiers, pour ne pas tout charger et décoder
d'un coup, tu peux en effet procéder par morceau.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Bonjour,

Je viens d'avoir la mauvaise surprise que mon code d'encodage ne
fonctionnait pas avec de gros fichier texte (8 Mo). J'ai une erreur
Overflow. Cela marche avec des fichiers plus petit mais là ?

Voici mon code :
k= Freefile
Open chemFichier For Binary As #k
sbuff = Space$(LOF(k))
Get #k, , sbuff
Close #k
FichierCode = base64_encode(sbuff)

J'ai essayé de l'encoder ligne par ligne avec line input mais là j'y
ai passé 1 h 30.

Donc comment je peux faire pour pour voir l'encoder sans souci ?

Christian.






Avatar
Christian
Voici mon code :
Private FichierCode As string ' Déclaré au niveau feuille

Private Sub BtEnvoyer_click()
Dim k as integer
dim ChemFichier, sbuff As string

k= Freefile
Open chemFichier For Binary As #k
sbuff = Space$(LOF(k))
Get #k, , sbuff
Close #k
FichierCode = Base64Decode$(sbuff)

L'erreur n'est pas signalé dans la fonction mais dans BtEnvoyer_Click()

"ng" a écrit dans le message de news:

Salut,

Pourtant chez moi cette fonction fonctionne parfaitement (et rapidement)
avec des fichiers de plusieurs dizaine de Mo, le problème doit être
ailleurs, peut on voir toute ta routine (déclaration des variables


comprise)
?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
> Salut,
>
> Merci pour la réponse. J'ai testé hier et aujourd'hui mais j'ai
> toujours la même chose. J'ai étendu les tests à de petit fichier
> moins de 300 K et je rencontre la même chose (avec ta fonction et la
> mienne). Pourtant comme je le disais dans mon premier post cela
> marchait bien, il est que je n'aie pas eu à l'utiliser depuis
> plusieurs mois.
>
> Je n'arrive pas à voir d'où cela peut venir.
>
> "ng" a écrit dans le message de news:
>
>> Salut,
>>
>> Essaye les fonctions suivantes, qui sont très optimisées :
>>
>> Public Function Base64Decode$(S$)
>> Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte, Dec(0
>> To 255) As Byte
>> If Len(S) = 0 Then Exit Function
>> Enc > >>
>


StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
>> vbFromUnicode)
>> For i = 0 To 255: Dec(i) = 64: Next
>> For i = 0 To 63: Dec(Enc(i)) = i: Next
>> L = Len(S): b = StrConv(S, vbFromUnicode)
>> ReDim Preserve Out(0 To (L 4) * 3 - 1)
>> For i = 0 To UBound(b) Step 4
>> Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
>> Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2)) 4): j
>> = j + 1 Out(j) = (Dec(b(i + 2)) And 3) * 64 Or Dec(b(i + 3)):
>> j = j + 1 Next i
>> If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1
>> Else j = 0 ReDim Preserve Out(0 To UBound(Out) - j)
>> Base64Decode = StrConv(Out, vbUnicode)
>> End Function
>>
>>
>> Sinon si t'as des gros fichiers, pour ne pas tout charger et décoder
>> d'un coup, tu peux en effet procéder par morceau.
>>
>> --
>> Nicolas G.
>> FAQ VB : http://faq.vb.free.fr
>> API Guide : http://www.allapi.net
>> Google Groups : http://groups.google.fr/
>> MZ-Tools : http://www.mztools.com/
>>
>> Christian wrote:
>>> Bonjour,
>>>
>>> Je viens d'avoir la mauvaise surprise que mon code d'encodage ne
>>> fonctionnait pas avec de gros fichier texte (8 Mo). J'ai une erreur
>>> Overflow. Cela marche avec des fichiers plus petit mais là ?
>>>
>>> Voici mon code :
>>> k= Freefile
>>> Open chemFichier For Binary As #k
>>> sbuff = Space$(LOF(k))
>>> Get #k, , sbuff
>>> Close #k
>>> FichierCode = base64_encode(sbuff)
>>>
>>> J'ai essayé de l'encoder ligne par ligne avec line input mais là j'y
>>> ai passé 1 h 30.
>>>
>>> Donc comment je peux faire pour pour voir l'encoder sans souci ?
>>>
>>> Christian.




Avatar
Christian
Je viens de régler le problème avec ma fonction d'encodage en base 64.
C'était un problème de porté de variable (elle était en integer). Par contre
je n'arrive pas à utiliser la fonction optimisée de Ng. J'ai essayé en
l'utilisant avec de simple mot. Là j'ai de drôle de truc. J'écris Test cela
marche j'écris Autre ou tout autre mot je rencontre un Out of Range.

La question est plutôt pour Ng vois-tu d'où provient le problème. Parce que
la mienne prend quand même pas mal de temps.

Christian.

"Christian" a écrit dans le message de news:
418a23bf$0$13809$
Voici mon code :
Private FichierCode As string ' Déclaré au niveau feuille

Private Sub BtEnvoyer_click()
Dim k as integer
dim ChemFichier, sbuff As string

k= Freefile
Open chemFichier For Binary As #k
sbuff = Space$(LOF(k))
Get #k, , sbuff
Close #k
FichierCode = Base64Decode$(sbuff)

L'erreur n'est pas signalé dans la fonction mais dans BtEnvoyer_Click()

"ng" a écrit dans le message de news:

> Salut,
>
> Pourtant chez moi cette fonction fonctionne parfaitement (et rapidement)
> avec des fichiers de plusieurs dizaine de Mo, le problème doit être
> ailleurs, peut on voir toute ta routine (déclaration des variables
comprise)
> ?
>
> --
> Nicolas G.
> FAQ VB : http://faq.vb.free.fr
> API Guide : http://www.allapi.net
> Google Groups : http://groups.google.fr/
> MZ-Tools : http://www.mztools.com/
>
> Christian wrote:
> > Salut,
> >
> > Merci pour la réponse. J'ai testé hier et aujourd'hui mais j'ai
> > toujours la même chose. J'ai étendu les tests à de petit fichier
> > moins de 300 K et je rencontre la même chose (avec ta fonction et la
> > mienne). Pourtant comme je le disais dans mon premier post cela
> > marchait bien, il est que je n'aie pas eu à l'utiliser depuis
> > plusieurs mois.
> >
> > Je n'arrive pas à voir d'où cela peut venir.
> >
> > "ng" a écrit dans le message de news:
> >
> >> Salut,
> >>
> >> Essaye les fonctions suivantes, qui sont très optimisées :
> >>
> >> Public Function Base64Decode$(S$)
> >> Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte, Dec(0
> >> To 255) As Byte
> >> If Len(S) = 0 Then Exit Function
> >> Enc > > >>
> >



StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
> >> vbFromUnicode)
> >> For i = 0 To 255: Dec(i) = 64: Next
> >> For i = 0 To 63: Dec(Enc(i)) = i: Next
> >> L = Len(S): b = StrConv(S, vbFromUnicode)
> >> ReDim Preserve Out(0 To (L 4) * 3 - 1)
> >> For i = 0 To UBound(b) Step 4
> >> Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
> >> Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2)) 4): j
> >> = j + 1 Out(j) = (Dec(b(i + 2)) And 3) * 64 Or Dec(b(i + 3)):
> >> j = j + 1 Next i
> >> If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1
> >> Else j = 0 ReDim Preserve Out(0 To UBound(Out) - j)
> >> Base64Decode = StrConv(Out, vbUnicode)
> >> End Function
> >>
> >>
> >> Sinon si t'as des gros fichiers, pour ne pas tout charger et décoder
> >> d'un coup, tu peux en effet procéder par morceau.
> >>
> >> --
> >> Nicolas G.
> >> FAQ VB : http://faq.vb.free.fr
> >> API Guide : http://www.allapi.net
> >> Google Groups : http://groups.google.fr/
> >> MZ-Tools : http://www.mztools.com/
> >>
> >> Christian wrote:
> >>> Bonjour,
> >>>
> >>> Je viens d'avoir la mauvaise surprise que mon code d'encodage ne
> >>> fonctionnait pas avec de gros fichier texte (8 Mo). J'ai une erreur
> >>> Overflow. Cela marche avec des fichiers plus petit mais là ?
> >>>
> >>> Voici mon code :
> >>> k= Freefile
> >>> Open chemFichier For Binary As #k
> >>> sbuff = Space$(LOF(k))
> >>> Get #k, , sbuff
> >>> Close #k
> >>> FichierCode = base64_encode(sbuff)
> >>>
> >>> J'ai essayé de l'encoder ligne par ligne avec line input mais là j'y
> >>> ai passé 1 h 30.
> >>>
> >>> Donc comment je peux faire pour pour voir l'encoder sans souci ?
> >>>
> >>> Christian.
>
>




Avatar
ng
Salut,

Oups je ne t'avais donné que la version qui décode pas qui encore, recoila
les 2 :

Public Function Base64Encode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte
If Len(S) = 0 Then Exit Function
Enc =
StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve b(0 To (UBound(b) 3) * 3 + 2)
ReDim Preserve Out(0 To (UBound(b) 3) * 4 + 3)
For i = 0 To UBound(b) - 1 Step 3
Out(j) = Enc(b(i) 4): j = j + 1
Out(j) = Enc((b(i + 1) 16) Or (b(i) And 3) * 16): j = j + 1
Out(j) = Enc((b(i + 2) 64) Or (b(i + 1) And 15) * 4): j = j + 1
Out(j) = Enc(b(i + 2) And 63): j = j + 1
Next i
For i = 1 To i - L: Out(UBound(Out) - i + 1) = 61: Next i
Base64Encode = StrConv(Out, vbUnicode)
End Function

Public Function Base64Decode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte, Dec(0 To 255)
As Byte
If Len(S) = 0 Then Exit Function
Enc =
StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
For i = 0 To 255: Dec(i) = 64: Next
For i = 0 To 63: Dec(Enc(i)) = i: Next
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve Out(0 To (L 4) * 3 - 1)
For i = 0 To UBound(b) Step 4
Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2)) 4): j = j + 1
Out(j) = (Dec(b(i + 2)) And 3) * 64 Or Dec(b(i + 3)): j = j + 1
Next i
If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1 Else j = 0
ReDim Preserve Out(0 To UBound(Out) - j)
Base64Decode = StrConv(Out, vbUnicode)
End Function

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Je viens de régler le problème avec ma fonction d'encodage en base 64.
C'était un problème de porté de variable (elle était en integer). Par
contre je n'arrive pas à utiliser la fonction optimisée de Ng. J'ai
essayé en l'utilisant avec de simple mot. Là j'ai de drôle de truc.
J'écris Test cela marche j'écris Autre ou tout autre mot je rencontre
un Out of Range.

La question est plutôt pour Ng vois-tu d'où provient le problème.
Parce que la mienne prend quand même pas mal de temps.

Christian.

"Christian" a écrit dans le message de
news: 418a23bf$0$13809$
Voici mon code :
Private FichierCode As string ' Déclaré au niveau feuille

Private Sub BtEnvoyer_click()
Dim k as integer
dim ChemFichier, sbuff As string

k= Freefile
Open chemFichier For Binary As #k
sbuff = Space$(LOF(k))
Get #k, , sbuff
Close #k
FichierCode = Base64Decode$(sbuff)

L'erreur n'est pas signalé dans la fonction mais dans
BtEnvoyer_Click()

"ng" a écrit dans le message de news:

Salut,

Pourtant chez moi cette fonction fonctionne parfaitement (et
rapidement) avec des fichiers de plusieurs dizaine de Mo, le
problème doit être ailleurs, peut on voir toute ta routine
(déclaration des variables comprise) ?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Salut,

Merci pour la réponse. J'ai testé hier et aujourd'hui mais j'ai
toujours la même chose. J'ai étendu les tests à de petit fichier
moins de 300 K et je rencontre la même chose (avec ta fonction et
la mienne). Pourtant comme je le disais dans mon premier post cela
marchait bien, il est que je n'aie pas eu à l'utiliser depuis
plusieurs mois.

Je n'arrive pas à voir d'où cela peut venir.

"ng" a écrit dans le message de news:

Salut,

Essaye les fonctions suivantes, qui sont très optimisées :

Public Function Base64Decode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte,
Dec(0 To 255) As Byte
If Len(S) = 0 Then Exit Function
Enc >>>>>










StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
For i = 0 To 255: Dec(i) = 64: Next
For i = 0 To 63: Dec(Enc(i)) = i: Next
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve Out(0 To (L 4) * 3 - 1)
For i = 0 To UBound(b) Step 4
Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2))
4): j = j + 1 Out(j) = (Dec(b(i + 2)) And 3) * 64 Or
Dec(b(i + 3)): j = j + 1 Next i
If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1
Else j = 0 ReDim Preserve Out(0 To UBound(Out) - j)
Base64Decode = StrConv(Out, vbUnicode)
End Function


Sinon si t'as des gros fichiers, pour ne pas tout charger et
décoder d'un coup, tu peux en effet procéder par morceau.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Bonjour,

Je viens d'avoir la mauvaise surprise que mon code d'encodage ne
fonctionnait pas avec de gros fichier texte (8 Mo). J'ai une
erreur Overflow. Cela marche avec des fichiers plus petit mais
là ?

Voici mon code :
k= Freefile
Open chemFichier For Binary As #k
sbuff = Space$(LOF(k))
Get #k, , sbuff
Close #k
FichierCode = base64_encode(sbuff)

J'ai essayé de l'encoder ligne par ligne avec line input mais là
j'y ai passé 1 h 30.

Donc comment je peux faire pour pour voir l'encoder sans souci ?

Christian.












Avatar
Christian
Salut,

Super géniale efficace ta fonction !!!

C'est un petit bijou, je n'ai pas assez de temps pour écrire tout
les"mercis" que tu mérites. Vraiment merci.

Christian.


"ng" a écrit dans le message de news:
#
Salut,

Oups je ne t'avais donné que la version qui décode pas qui encore, recoila
les 2 :

Public Function Base64Encode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte
If Len(S) = 0 Then Exit Function
Enc >


StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve b(0 To (UBound(b) 3) * 3 + 2)
ReDim Preserve Out(0 To (UBound(b) 3) * 4 + 3)
For i = 0 To UBound(b) - 1 Step 3
Out(j) = Enc(b(i) 4): j = j + 1
Out(j) = Enc((b(i + 1) 16) Or (b(i) And 3) * 16): j = j + 1
Out(j) = Enc((b(i + 2) 64) Or (b(i + 1) And 15) * 4): j = j + 1
Out(j) = Enc(b(i + 2) And 63): j = j + 1
Next i
For i = 1 To i - L: Out(UBound(Out) - i + 1) = 61: Next i
Base64Encode = StrConv(Out, vbUnicode)
End Function

Public Function Base64Decode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte, Dec(0 To


255)
As Byte
If Len(S) = 0 Then Exit Function
Enc >


StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
For i = 0 To 255: Dec(i) = 64: Next
For i = 0 To 63: Dec(Enc(i)) = i: Next
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve Out(0 To (L 4) * 3 - 1)
For i = 0 To UBound(b) Step 4
Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2)) 4): j = j +


1
Out(j) = (Dec(b(i + 2)) And 3) * 64 Or Dec(b(i + 3)): j = j + 1
Next i
If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1 Else j 0
ReDim Preserve Out(0 To UBound(Out) - j)
Base64Decode = StrConv(Out, vbUnicode)
End Function

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
> Je viens de régler le problème avec ma fonction d'encodage en base 64.
> C'était un problème de porté de variable (elle était en integer). Par
> contre je n'arrive pas à utiliser la fonction optimisée de Ng. J'ai
> essayé en l'utilisant avec de simple mot. Là j'ai de drôle de truc.
> J'écris Test cela marche j'écris Autre ou tout autre mot je rencontre
> un Out of Range.
>
> La question est plutôt pour Ng vois-tu d'où provient le problème.
> Parce que la mienne prend quand même pas mal de temps.
>
> Christian.
>
> "Christian" a écrit dans le message de
> news: 418a23bf$0$13809$
>> Voici mon code :
>> Private FichierCode As string ' Déclaré au niveau feuille
>>
>> Private Sub BtEnvoyer_click()
>> Dim k as integer
>> dim ChemFichier, sbuff As string
>>
>> k= Freefile
>> Open chemFichier For Binary As #k
>> sbuff = Space$(LOF(k))
>> Get #k, , sbuff
>> Close #k
>> FichierCode = Base64Decode$(sbuff)
>>
>> L'erreur n'est pas signalé dans la fonction mais dans
>> BtEnvoyer_Click()
>>
>> "ng" a écrit dans le message de news:
>>
>>> Salut,
>>>
>>> Pourtant chez moi cette fonction fonctionne parfaitement (et
>>> rapidement) avec des fichiers de plusieurs dizaine de Mo, le
>>> problème doit être ailleurs, peut on voir toute ta routine
>>> (déclaration des variables comprise) ?
>>>
>>> --
>>> Nicolas G.
>>> FAQ VB : http://faq.vb.free.fr
>>> API Guide : http://www.allapi.net
>>> Google Groups : http://groups.google.fr/
>>> MZ-Tools : http://www.mztools.com/
>>>
>>> Christian wrote:
>>>> Salut,
>>>>
>>>> Merci pour la réponse. J'ai testé hier et aujourd'hui mais j'ai
>>>> toujours la même chose. J'ai étendu les tests à de petit fichier
>>>> moins de 300 K et je rencontre la même chose (avec ta fonction et
>>>> la mienne). Pourtant comme je le disais dans mon premier post cela
>>>> marchait bien, il est que je n'aie pas eu à l'utiliser depuis
>>>> plusieurs mois.
>>>>
>>>> Je n'arrive pas à voir d'où cela peut venir.
>>>>
>>>> "ng" a écrit dans le message de news:
>>>>
>>>>> Salut,
>>>>>
>>>>> Essaye les fonctions suivantes, qui sont très optimisées :
>>>>>
>>>>> Public Function Base64Decode$(S$)
>>>>> Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte,
>>>>> Dec(0 To 255) As Byte
>>>>> If Len(S) = 0 Then Exit Function
>>>>> Enc > >>>>>
>>>>
>>
>


StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
>>>>> vbFromUnicode)
>>>>> For i = 0 To 255: Dec(i) = 64: Next
>>>>> For i = 0 To 63: Dec(Enc(i)) = i: Next
>>>>> L = Len(S): b = StrConv(S, vbFromUnicode)
>>>>> ReDim Preserve Out(0 To (L 4) * 3 - 1)
>>>>> For i = 0 To UBound(b) Step 4
>>>>> Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
>>>>> Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2))
>>>>> 4): j = j + 1 Out(j) = (Dec(b(i + 2)) And 3) * 64 Or
>>>>> Dec(b(i + 3)): j = j + 1 Next i
>>>>> If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1
>>>>> Else j = 0 ReDim Preserve Out(0 To UBound(Out) - j)
>>>>> Base64Decode = StrConv(Out, vbUnicode)
>>>>> End Function
>>>>>
>>>>>
>>>>> Sinon si t'as des gros fichiers, pour ne pas tout charger et
>>>>> décoder d'un coup, tu peux en effet procéder par morceau.
>>>>>
>>>>> --
>>>>> Nicolas G.
>>>>> FAQ VB : http://faq.vb.free.fr
>>>>> API Guide : http://www.allapi.net
>>>>> Google Groups : http://groups.google.fr/
>>>>> MZ-Tools : http://www.mztools.com/
>>>>>
>>>>> Christian wrote:
>>>>>> Bonjour,
>>>>>>
>>>>>> Je viens d'avoir la mauvaise surprise que mon code d'encodage ne
>>>>>> fonctionnait pas avec de gros fichier texte (8 Mo). J'ai une
>>>>>> erreur Overflow. Cela marche avec des fichiers plus petit mais
>>>>>> là ?
>>>>>>
>>>>>> Voici mon code :
>>>>>> k= Freefile
>>>>>> Open chemFichier For Binary As #k
>>>>>> sbuff = Space$(LOF(k))
>>>>>> Get #k, , sbuff
>>>>>> Close #k
>>>>>> FichierCode = base64_encode(sbuff)
>>>>>>
>>>>>> J'ai essayé de l'encoder ligne par ligne avec line input mais là
>>>>>> j'y ai passé 1 h 30.
>>>>>>
>>>>>> Donc comment je peux faire pour pour voir l'encoder sans souci ?
>>>>>>
>>>>>> Christian.




Avatar
ng
Salut,

Mais y a pas de quoi ;)

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Salut,

Super géniale efficace ta fonction !!!

C'est un petit bijou, je n'ai pas assez de temps pour écrire tout
les"mercis" que tu mérites. Vraiment merci.

Christian.


"ng" a écrit dans le message de news:
#
Salut,

Oups je ne t'avais donné que la version qui décode pas qui encore,
recoila les 2 :

Public Function Base64Encode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte
If Len(S) = 0 Then Exit Function
Enc >>


StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve b(0 To (UBound(b) 3) * 3 + 2)
ReDim Preserve Out(0 To (UBound(b) 3) * 4 + 3)
For i = 0 To UBound(b) - 1 Step 3
Out(j) = Enc(b(i) 4): j = j + 1
Out(j) = Enc((b(i + 1) 16) Or (b(i) And 3) * 16): j = j + 1
Out(j) = Enc((b(i + 2) 64) Or (b(i + 1) And 15) * 4): j = j
+ 1 Out(j) = Enc(b(i + 2) And 63): j = j + 1
Next i
For i = 1 To i - L: Out(UBound(Out) - i + 1) = 61: Next i
Base64Encode = StrConv(Out, vbUnicode)
End Function

Public Function Base64Decode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte, Dec(0
To 255) As Byte
If Len(S) = 0 Then Exit Function
Enc >>


StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
For i = 0 To 255: Dec(i) = 64: Next
For i = 0 To 63: Dec(Enc(i)) = i: Next
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve Out(0 To (L 4) * 3 - 1)
For i = 0 To UBound(b) Step 4
Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j + 1
Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2)) 4): j
= j + 1 Out(j) = (Dec(b(i + 2)) And 3) * 64 Or Dec(b(i + 3)):
j = j + 1 Next i
If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1
Else j = 0 ReDim Preserve Out(0 To UBound(Out) - j)
Base64Decode = StrConv(Out, vbUnicode)
End Function

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Je viens de régler le problème avec ma fonction d'encodage en base
64. C'était un problème de porté de variable (elle était en
integer). Par contre je n'arrive pas à utiliser la fonction
optimisée de Ng. J'ai essayé en l'utilisant avec de simple mot. Là
j'ai de drôle de truc. J'écris Test cela marche j'écris Autre ou
tout autre mot je rencontre un Out of Range.

La question est plutôt pour Ng vois-tu d'où provient le problème.
Parce que la mienne prend quand même pas mal de temps.

Christian.

"Christian" a écrit dans le message de
news: 418a23bf$0$13809$
Voici mon code :
Private FichierCode As string ' Déclaré au niveau feuille

Private Sub BtEnvoyer_click()
Dim k as integer
dim ChemFichier, sbuff As string

k= Freefile
Open chemFichier For Binary As #k
sbuff = Space$(LOF(k))
Get #k, , sbuff
Close #k
FichierCode = Base64Decode$(sbuff)

L'erreur n'est pas signalé dans la fonction mais dans
BtEnvoyer_Click()

"ng" a écrit dans le message de news:

Salut,

Pourtant chez moi cette fonction fonctionne parfaitement (et
rapidement) avec des fichiers de plusieurs dizaine de Mo, le
problème doit être ailleurs, peut on voir toute ta routine
(déclaration des variables comprise) ?

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Salut,

Merci pour la réponse. J'ai testé hier et aujourd'hui mais j'ai
toujours la même chose. J'ai étendu les tests à de petit fichier
moins de 300 K et je rencontre la même chose (avec ta fonction et
la mienne). Pourtant comme je le disais dans mon premier post
cela marchait bien, il est que je n'aie pas eu à l'utiliser
depuis plusieurs mois.

Je n'arrive pas à voir d'où cela peut venir.

"ng" a écrit dans le message de news:

Salut,

Essaye les fonctions suivantes, qui sont très optimisées :

Public Function Base64Decode$(S$)
Dim b() As Byte, Out() As Byte, i&, j&, L&, Enc() As Byte,
Dec(0 To 255) As Byte
If Len(S) = 0 Then Exit Function
Enc >>>>>>>















StrConv("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
vbFromUnicode)
For i = 0 To 255: Dec(i) = 64: Next
For i = 0 To 63: Dec(Enc(i)) = i: Next
L = Len(S): b = StrConv(S, vbFromUnicode)
ReDim Preserve Out(0 To (L 4) * 3 - 1)
For i = 0 To UBound(b) Step 4
Out(j) = (Dec(b(i)) * 4) Or (Dec(b(i + 1)) 16): j = j +
1 Out(j) = (Dec(b(i + 1)) And 15) * 16 Or (Dec(b(i + 2))
4): j = j + 1 Out(j) = (Dec(b(i + 2)) And 3) * 64 Or
Dec(b(i + 3)): j = j + 1 Next i
If b(L - 2) = 61 Then j = 2 Else If b(L - 1) = 61 Then j = 1
Else j = 0 ReDim Preserve Out(0 To UBound(Out) - j)
Base64Decode = StrConv(Out, vbUnicode)
End Function


Sinon si t'as des gros fichiers, pour ne pas tout charger et
décoder d'un coup, tu peux en effet procéder par morceau.

--
Nicolas G.
FAQ VB : http://faq.vb.free.fr
API Guide : http://www.allapi.net
Google Groups : http://groups.google.fr/
MZ-Tools : http://www.mztools.com/

Christian wrote:
Bonjour,

Je viens d'avoir la mauvaise surprise que mon code d'encodage
ne fonctionnait pas avec de gros fichier texte (8 Mo). J'ai une
erreur Overflow. Cela marche avec des fichiers plus petit mais
là ?

Voici mon code :
k= Freefile
Open chemFichier For Binary As #k
sbuff = Space$(LOF(k))
Get #k, , sbuff
Close #k
FichierCode = base64_encode(sbuff)

J'ai essayé de l'encoder ligne par ligne avec line input mais
là j'y ai passé 1 h 30.

Donc comment je peux faire pour pour voir l'encoder sans souci
?

Christian.