为了账号安全,请及时绑定邮箱和手机立即绑定

编码/解码 base64

编码/解码 base64

Go
蛊毒传说 2021-06-03 13:39:54
这是我的代码,我不明白为什么解码功能不起作用。一点点洞察力会很好。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]
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

DecodedLen返回最大长度。


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


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


l, _ := base64.StdEncoding.Decode(base64Text, []byte(message))

log.Printf("base64: %s\n", base64Text[:l])


查看完整回答
反对 回复 2021-06-07
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-06-07
  • 3 回答
  • 0 关注
  • 232 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信