【问题标题】:Doing base64 decoding on a string in Go在 Go 中对字符串进行 base64 解码
【发布时间】:2021-08-23 23:40:41
【问题描述】:

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

【问题讨论】:

  • 标准 Base64 的字母表不包含反斜杠。所以 qU4aaakFmjaaaaI5aaa\/EN\/aaa\/SaaaJaaa6aa+nGnk= 输入不是有效的 Base64 编码字符串。你能指望什么?其他语言如何跳过或省略此错误不适用于 Go。
  • 关于如何让它工作的任何建议?我正在将此字符串与其他两种语言一起使用,并且无法更改它。我尝试删除 \ / 字符,最终在字节 40 上出现错误(现在包含 "=" )。也删除了那个,但它给出了字节 0 的错误。
  • 正斜杠是 Base64 中的有效字符,而不是反斜杠。 \/ 可能是一个指定单个斜杠的序列。如果是这样,请将 \/ 序列替换为单个 /,然后您就可以开始了。
  • 删除反斜杠给我留下了qU4aaakFmjaaaaI5aaa/EN/aaa/SaaaJaaa6aa+nGnk=,但这也会返回一个错误:illegal base64 data at input byte 0
  • 删除反斜杠会产生有效的 Base64 输入,请在 Go Playground 上尝试。

标签: string go base64


【解决方案1】:

标准 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))

哪些输出(在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))
}

输出是一样的。在Go Playground 上试试这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-27
    • 2019-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多