Base64DecoderBuffer()
Syntaxe
Resultat = Base64DecoderBuffer(*TamponSource, LongueurSource, *TamponDestination, LongueurDestination)Description
Décode un tampon codé en Base64.
Arguments
*TamponSource Le tampon contenant les données codées. LongueurSource La taille de la mémoire tampon d'entrée. *TamponDestination Le tampon de sortie où les données seront copiées. LongueurDestination La taille de la mémoire tampon de sortie. La mémoire tampon de sortie peut être jusqu'à 25% plus petite que le tampon d'entrée, avec une taille minimale de 64 octets.
Il est recommandé de faire un tampon légèrement plus grand, par exemple 20%, pour éviter les débordements.
Valeur de retour
Renvoie la longueur des données décodées en octets.
Exemple: Encodage & Décodage d'une variable texte
Exemple$ = "Voici une phrase !"
Decoded$ = Space(1024)
Encoded$ = Space(1024)
Debug Base64EncoderBuffer(@Exemple$, StringByteLength(Exemple$), @Encoded$, StringByteLength(Encoded$))
Debug Encoded$
Debug Base64DecoderBuffer(@Encoded$, StringByteLength(Encoded$), @Decoded$, StringByteLength(Decoded$))
Debug Decoded$
Exemple: Encodage & Décodage d'une DataSection
DataSection
TestDebut:
Data.a $00, $01, $02, $03, $04, $05, $06, $07
Data.a $08, $09, $0A, $0B, $0C, $0D, $0E, $0F
TestFin:
EndDataSection
Taille = (?TestFin - ?TestDebut) * 1.35
If Taille < 64
Taille = 64
EndIf
*EncodeBuffer = AllocateMemory(Taille)
Taille = Base64EncoderBuffer(?TestDebut, ?TestFin - ?TestDebut, *EncodeBuffer, MemorySize(*EncodeBuffer))
ChaineEncodee$ = PeekS(*EncodeBuffer, Taille, #PB_Ascii)
Debug ChaineEncodee$
*DecodeBuffer = AllocateMemory(Taille)
Taille = PokeS(*EncodeBuffer, ChaineEncodee$, StringByteLength(ChaineEncodee$, #PB_Ascii), #PB_Ascii|#PB_String_NoZero)
Taille = Base64DecoderBuffer(*EncodeBuffer, Taille, *DecodeBuffer, MemorySize(*DecodeBuffer))
ShowMemoryViewer(*DecodeBuffer, Taille)
Exemple: Problème de décodage d'une variable texte déjà codé en Base64 par un logiciel externe
; Attention, il est délicat d'utiliser une variable pour décoder un texte
; déjà codé en Base64 par un logiciel externe (messagerie par exemple)
Encoded$ = "Vm9pY2kgdW5lIHBocmFzZSAh" ;"Voici une phrase !", codée en Base64 utf8
Decoded$ = Space(1024)
Debug Base64DecoderBuffer(@Encoded$, StringByteLength(Encoded$), @Decoded$, 1024)
Debug Decoded$ ; ==> Affiche n'importe quoi
; Pour résoudre ce problème, suivre la procédure ci-dessous
; Différents exemples de textes déjà codés
Encode_utf8$ = "Vm9pY2kgdW5lIHBocmFzZSBow6kgIQ0K" ;Voici une phrase hé !, codée en Base64 utf8
Encode_iso8859_1$ = "Vm9pY2kgdW5lIHBocmFzZSBo6SAhDQo=" ;Voici une phrase hé !, codée en Base64 iso8859_1$
Encode_ascii$ = "Vm9pY2kgdW5lIHBocmFzZSBoICENCg==" ;Voici une phrase hé !, codée en Base64 ascii
Procedure.s Decode64(Texte64.s, Option=#PB_UTF8)
Protected *in, *out
Protected Resultat.s
*in = Ascii(Texte64) ; Le texte codé en Base64 est supposé être en ascii pour PureBasic
If *in <> 0
; La mémoire tampon de sortie peut être jusqu'à 33% plus petite que le tampon d'entrée
*out = AllocateMemory(MemoryStringLength(*in,#PB_Ascii) * 0.8) ; Ici nous prenons une valeur de 20%
If *out <> 0
Base64DecoderBuffer(*in, MemorySize(*in), *out, MemorySize(*out)) ; Décodage...
Resultat = PeekS(*out, -1, Option) ; Le résultat est transféré dans une variable
FreeMemory(*out)
EndIf
FreeMemory(*in)
EndIf
ProcedureReturn Resultat
EndProcedure
Debug Decode64(Encode_utf8$) ; Affiche: Voici une phrase hé !
Debug Decode64(Encode_iso8859_1$, #PB_Ascii) ; Affiche: Voici une phrase hé ! (iso8859_1 est aussi appelée Latin-1 ou Europe occidentale et contient tous les caractères ascii)
Debug Decode64(Encode_ascii$, #PB_Ascii) ; Affiche: Voici une phrase h ! (problème avec lettres accentuées...)
; car le codage Base64 ascii s'arrête au caractère ascii n°127
Voir aussi
Base64EncoderBuffer()
OS Supportés
Tous