45

这是我的代码,我不明白为什么解码功能不起作用。

请稍有洞察力会很棒。

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]

4

4 回答 4

33

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

(也在这里


输出

SGVsbG8sIHBsYXlncm91bmQ=
"Hello, playground"

编辑:我读得太快了,len 没有用作前缀。dystroy 做对了。

于 2013-03-11T08:46:12.677 回答
32

DecodedLen返回最大长度。

此长度对于调整缓冲区大小很有用,但缓冲区的一部分不会被写入,因此不是有效的 UTF-8。

您必须仅使用Decode函数返回的实际书面长度。

l, _ := base64.StdEncoding.Decode(base64Text, []byte(message))
log.Printf("base64: %s\n", base64Text[:l])
于 2013-03-11T08:52:33.587 回答
16

总结其他两篇文章,这里有两个使用 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
}

尝试一下!

于 2015-02-23T11:31:45.970 回答
3

@Denys Sé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]))
}

在这里试试。

于 2019-03-19T09:49:28.543 回答