这是我的代码,我不明白为什么解码功能不起作用。
请小小的见解。
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)
}
它给了我: [解码错误 - 输出不是utf-8] [解码错误 - 输出不是utf-8]
答案 0 :(得分:18)
len前缀是肤浅的,导致无效的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)
}
(还here)
输出
SGVsbG8sIHBsYXlncm91bmQ=
"Hello, playground"
编辑:我读得太快,len没有被用作前缀。 dystroy做对了。
答案 1 :(得分:16)
DecodedLen
返回最大长度。
此长度对于调整缓冲区大小非常有用,但是部分缓冲区不会被写入,因此无法使用UTF-8。
您必须仅使用Decode
函数返回的实际书写长度。
l, _ := base64.StdEncoding.Decode(base64Text, []byte(message))
log.Printf("base64: %s\n", base64Text[:l])
答案 2 :(得分:5)
总结另外两篇文章,这里有两个用Go编码/解码Base64字符串的简单函数:
// 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
}
答案 3 :(得分:1)
答案 4 :(得分:0)
@DenysSéguret的答案几乎是100%正确的。为了避免使用base64Text
中的未用空间浪费内存,请使用base64.DecodedLen。看一下base64.DecodeString的用法。
它应该看起来像这样:
func main() {
message := base64.StdEncoding.EncodeToString([]byte("Hello, playground"))
base64Text := make([]byte, base64.StdEncoding.DecodedLen(len(message)))
n, _ := base64.StdEncoding.Decode(base64Text, []byte(message))
fmt.Println("base64Text:", string(base64Text[:n]))
}
here试试。