有一种方法可以将字符串编码到 Base64 或从 Base64 解码,而无需在末尾进行填充?我的意思是“==”结局。
我正在使用
base64.URLEncoding.EncodeToString
进行编码,它工作得很好,但我没有找到一种方法来决定不在末尾使用填充(就像在 java 上一样)。
Go1.5 将在 WithPadding
上有
Encoding
选项。
RawStdEncoding
和 RawURLEncoding
,它们没有填充。
虽然您使用的是应用程序引擎,并且暂时无法访问 Go1.5,但您可以创建一些辅助函数来根据需要添加和删除填充。
这是一个对字符串进行编码和解码的示例。如果您需要,可以使用
[]byte
轻松对其进行调整以更高效地工作。
func base64EncodeStripped(s string) string {
encoded := base64.StdEncoding.EncodeToString([]byte(s))
return strings.TrimRight(encoded, "=")
}
func base64DecodeStripped(s string) (string, error) {
if i := len(s) % 4; i != 0 {
s += strings.Repeat("=", 4-i)
}
decoded, err := base64.StdEncoding.DecodeString(s)
return string(decoded), err
}
简单来说,
使用
base64.RawStdEncoding.EncodeToString
代替 base64.StdEncoding.EncodeToString
或者其他
使用
base64.RawURLEncoding.EncodeToString
代替 base64.URLEncoding.EncodeToString
。
// RawURLEncoding is the unpadded alternate base64 encoding defined in RFC 4648.
// It is typically used in URLs and file names.
// This is the same as URLEncoding but omits padding characters.
编码:
str := "encode this"
encodedStr := base64.StdEncoding.
WithPadding(base64.NoPadding).
EncodeToString([]byte(str))
fmt.Println(encodedStr)
解码:
data, err := base64.
StdEncoding.WithPadding(base64.NoPadding).
DecodeString(encodedStr)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(data))
要在golang中省略base64编码的填充字符并使结果url安全,您可以使用
value := base64.RawURLEncoding.EncodeToString(bytes)
RawURLEncoding 是 RFC 4648 中定义的未填充的备用 Base64 编码。它通常用于 URL 和文件名。这与 URLEncoding 相同,但省略了填充字符。