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

String 在Go中对字符串执行base64解码,string,go,base64,String,Go,Base64,我有一个特殊的字符串,我需要在Go中运行base64解码。此字符串类似于以下内容: qu4aakfmjaaaai5aaa\/EN\/aaa\/SaaaJaaa6aa+nGnk= 请注意,这不是完全相同的字符串,但它有相同的形状和字符数,填充字符,并且在字符串中的相同位置上有\/内容 我们叫它钥匙吧 在PHP中,如果我运行 base64_解码($key) 解码操作成功 如果我用Python运行 base64.b64解码(键) 解码操作再次成功。问题是,我不能在围棋中对这东西进行base64解码 d

我有一个特殊的字符串,我需要在Go中运行base64解码。此字符串类似于以下内容:

qu4aakfmjaaaai5aaa\/EN\/aaa\/SaaaJaaa6aa+nGnk=

请注意,这不是完全相同的字符串,但它有相同的形状和字符数,填充字符,并且在字符串中的相同位置上有
\/
内容

我们叫它钥匙吧

在PHP中,如果我运行

base64_解码($key)

解码操作成功

如果我用Python运行

base64.b64解码(键)

解码操作再次成功。问题是,我不能在围棋中对这东西进行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

在围棋版本中,我必须避开那些反斜杠。错误似乎出现在字节19处。请记住,我作为示例使用的这个字符串的长度与实际导致问题的字符串的长度相同,我相信错误发生在带\字符的字节上。对此我能做些什么?

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


正斜杠是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))
哪些输出(在上尝试):

如果
\/
不是特殊序列,并且您希望从输入中丢弃所有无效字符,则可以这样做:

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

输出是相同的。请在上尝试此选项。

标准Base64的字母表不包含反斜杠。因此,
qU4aaakFmjaaaaI5aaa\/EN\/aaa\/SaaaJaaa6aa+nGnk=
输入不是有效的Base64编码字符串。你期待什么?其他语言如何跳过或省略此错误不适用于Go。关于如何使其工作有任何建议吗?我将这个字符串与其他两种语言一起使用,无法更改它。我尝试删除\/个字符,结果在字节40(现在包含“=”)上出现错误。也删除了该字符,但它给出了字节0的错误。正斜杠是Base64中的有效字符,而不是反斜杠。
\/
可能是指定单个斜杠的序列。如果是这样的话,用一个
\/
序列替换
\/
序列就可以了。删除反斜杠会产生有效的Base64输入,请在上尝试。默认情况下,Python Base64.B64解码函数会丢弃字母表之外的输入字符。(). 要复制python结果,请在调用decode之前使用strings.ReplaceAll丢弃问题字符。
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))
}