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'à 33% 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 30%, 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

<- Base64Decoder() - Cipher Index - Base64Encoder() ->