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

我有一个特定的字符串,我需要在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 处。请记住,我用作示例的这个字符串与实际导致问题的字符串具有相同的长度,我相信错误恰好发生在带有\字符的字节处。我该怎么办?


白猪掌柜的
浏览 177回答 1
1回答

慕森王

标准 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.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go