2013-03-11 6 views
14

Voici mon code et je ne comprends pas pourquoi la fonction de décodage ne fonctionne pas.Encode/Decode base64

Peu de perspicacité serait grande s'il vous plaît.

func EncodeB64(message string) (retour string) { 
    base64Text := make([]byte, base64.StdEncoding.EncodedLen(len(message))) 
    base64.StdEncoding.Encode(base64Text, []byte(message)) 
    return string(base64Text) 
} 

func DecodeB64(message string) (retour string) { 
    base64Text := make([]byte, base64.StdEncoding.DecodedLen(len(message))) 
    base64.StdEncoding.Decode(base64Text, []byte(message)) 
    fmt.Printf("base64: %s\n", base64Text) 
    return string(base64Text) 
} 

Il me gaves: [Erreur Decode - sortie non utf-8] [Erreur Decode - sortie non utf-8]

Répondre

9

DecodedLen renvoie la maximale longueur.

Cette longueur est utile pour dimensionner votre tampon mais une partie du tampon ne sera pas écrite et ne sera donc pas valide UTF-8.

Vous devez utiliser uniquement la longueur réelle en écriture retournée par la fonction Decode.

l, _ := base64.StdEncoding.Decode(base64Text, []byte(message)) 
log.Printf("base64: %s\n", base64Text[:l]) 
11

Le préfixe len est superficiel et provoque l'invalide erreur utf-8:

package main 

import (
     "encoding/base64" 
     "fmt" 
     "log" 
) 

func main() { 
     str := base64.StdEncoding.EncodeToString([]byte("Hello, playground")) 
     fmt.Println(str) 

     data, err := base64.StdEncoding.DecodeString(str) 
     if err != nil { 
       log.Fatal("error:", err) 
     } 

     fmt.Printf("%q\n", data) 
} 

(également here)


sortie

SGVsbG8sIHBsYXlncm91bmQ= 
"Hello, playground" 

EDIT: J'ai lu trop vite, le len n'a pas été utilisé comme préfixe. dystroy l'a bien compris.

3

Pour résumer les deux autres postes, voici deux fonctions simples pour encoder/décoder les chaînes BASE64 avec Go:

// Dont forget to import "encoding/base64"! 

func base64Encode(str string) string { 
    return base64.StdEncoding.EncodeToString([]byte(str)) 
} 

func base64Decode(str string) (string, bool) { 
    data, err := base64.StdEncoding.DecodeString(str) 
    if err != nil { 
     return "", true 
    } 
    return string(data), false 
} 

Try it!