在 Go 中对字符串进行 base64 解码
Doing base64 decoding on a string in Go
我有一个特定的字符串需要在 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
这将return错误
illegal base64 data at input byte 19
在 Go 版本中,我必须转义那些反斜杠。错误似乎出现在字节 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))
哪些输出(在 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.
上试试这个
我有一个特定的字符串需要在 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
这将return错误
illegal base64 data at input byte 19
在 Go 版本中,我必须转义那些反斜杠。错误似乎出现在字节 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))
哪些输出(在 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.
上试试这个