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

在 Go 中对字符串执行 base64 解码

在 Go 中对字符串执行 base64 解码

Go
白猪掌柜的 2022-09-05 11:03:11
我有一个特定的字符串,我需要在Go中运行base64解码。此字符串如下所示:qU4aaakFmjaaaaI5aaa\/EN\/aaa\/SaaaJaaa6aa+nGnk=请注意,这不是完全相同的字符串,但它确实具有相同的形状和字符数,填充字符,并且在字符串中的相同位置具有这些内容。\/让我们称之为密钥。在 PHP 中,如果我运行base64_decode($key);解码操作成功如果在Python中我运行base64.b64decode(key)解码操作再次成功。问题是,我不能在Go中对这个东西进行base64解码。dcd, err := base64.StdEncoding.DecodeString("qU4aaakFmjaaaaI5aaa\\/EN\\/aaa\\/SaaaJaaa6aa+nGnk=")if err != nil {    log.Fatal(err)}return dcd这将返回错误illegal base64 data at input byte 19在Go版本中,我必须转义这些反斜杠。该错误似乎出现在字节 19 处。请记住,我用作示例的这个字符串与实际导致问题的字符串具有相同的长度,我相信错误恰好发生在带有\字符的字节处。我该怎么办?
查看完整描述

1 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

标准 Base64 的字母表不包含反斜杠。因此输入不是有效的 Base64 编码字符串。qU4aaakFmjaaaaI5aaa\/EN\/aaa\/SaaaJaaa6aa+nGnk=


正斜杠是 Base64 中的有效字符,但不是反斜杠。可能是指定单个斜杠的序列。如果是这样,请将序列替换为单个序列,然后您就可以开始了。\/\//


例如:


s := `qU4aaakFmjaaaaI5aaa\/EN\/aaa\/SaaaJaaa6aa+nGnk=`

s = strings.ReplaceAll(s, `\/`, `/`)

dcd, err := base64.StdEncoding.DecodeString(s)

if err != nil {

    log.Fatal(err)

}


fmt.Println(string(dcd))

哪些输出(在Go Playground上尝试):


�Ni��6�i�9i����i��i��i��i��y

如果不是特殊序列,并且您希望从输入中丢弃所有无效字符,则可以按照以下方法完成此操作:\/


var valid = map[rune]bool{}


func init() {

    for _, r := range "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" {

        valid[r] = true

    }

}


func clean(s string) string {

    return strings.Map(func(r rune) rune {

        if valid[r] {

            return r

        }

        return -1

    }, s)

}


func main() {

    s := `qU4aaakFmjaaaaI5aaa\/EN\/aaa\/SaaaJaaa6aa+nGnk=`

    s = clean(s)

    dcd, err := base64.StdEncoding.DecodeString(s)

    if err != nil {

        log.Fatal(err)

    }


    fmt.Println(string(dcd))

}

Output is the same. Try this one on the Go Playground.


查看完整回答
反对 回复 2022-09-05
  • 1 回答
  • 0 关注
  • 164 浏览
慕课专栏
更多

添加回答

举报

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