编码/解码 base64

新手上路,请多包涵

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

请少见识。

 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]

原文由 Bussiere 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 568
2 个回答

DecodedLen 返回 最大 长度。

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

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

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

原文由 Denys Séguret 发布,翻译遵循 CC BY-SA 3.0 许可协议

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 做对了。

原文由 zzzz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题