here is my code and i don't understand why the decode function doesn't work.
Little insight would be great please.
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)
}
It gaves me : [Decode error - output not utf-8][Decode error - output not utf-8]
DecodedLen
returns the maximal length.This length is useful for sizing your buffer but part of the buffer won't be written and thus won't be valid UTF-8.
You have to use only the real written length returned by the
Decode
function.See this Example (code/decode base64):
http://play.golang.org/p/t6rFm2x4Yr
@firebitsbr
The len prefix is superficial and causes the invalid utf-8 error:
(Also here)
Output
EDIT: I read too fast, the len was not used as a prefix. dystroy got it right.
@Denys Séguret's answer is almost 100% correct. As an improvement to avoid wasting memory with non used space in
base64Text
, you should use base64.DecodedLen. Take a look at how base64.DecodeString uses it. It should look like this:Try it here.
To sum up the other two posts, here are two simple functions to encode/decode Base64 strings with Go:
Try it!