2013-03-11 7 views
14

Questo è il mio codice e non capisco perché la funzione di decodifica non funzioni.Codifica/base decodifica64

Piccola intuizione sarebbe grande per favore.

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) 
} 

Mi gaves: [Decode errore - uscita non UTF-8] [errore Decode - uscita non UTF-8]

risposta

9

DecodedLen restituisce la lunghezza massima .

Questa lunghezza è utile per dimensionare il buffer ma parte del buffer non verrà scritta e quindi non sarà UTF-8 valida.

È necessario utilizzare solo la lunghezza scritta reale restituita dalla funzione Decode.

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

Il prefisso len è superficiale e provoca l'errore utf-8 non valida:

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) 
} 

(anche here)


uscita

SGVsbG8sIHBsYXlncm91bmQ= 
"Hello, playground" 

MODIFICA: Ho letto troppo velocemente, la len non è stata utilizzata come prefisso. DISTROY ha capito bene.

3

Riassumendo gli altri due posti, qui ci sono due semplici funzioni di codifica/decodifica le stringhe Base64 con 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!