在 golang (appengine) 上无需填充的 Base64 编码/解码

问题描述 投票:0回答:4

有一种方法可以将字符串编码到 Base64 或从 Base64 解码,而无需在末尾进行填充?我的意思是“==”结局。

我正在使用

base64.URLEncoding.EncodeToString
进行编码,它工作得很好,但我没有找到一种方法来决定不在末尾使用填充(就像在 java 上一样)。

google-app-engine go encoding base64
4个回答
21
投票

Go1.5 将在 WithPadding

 上有 
Encoding
 选项。 

这还将添加 2 个预定义编码,

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
}

9
投票

简单来说,

使用

base64.RawStdEncoding.EncodeToString
代替
base64.StdEncoding.EncodeToString

或者其他

使用

base64.RawURLEncoding.EncodeToString
代替
base64.URLEncoding.EncodeToString

参考:参见源代码注释第94行至110行

// 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.

0
投票

编码:

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

去游乐场:https://go.dev/play/p/TAZgLMSSe-K


0
投票

要在golang中省略base64编码的填充字符并使结果url安全,您可以使用

value := base64.RawURLEncoding.EncodeToString(bytes)

RawURLEncoding 是 RFC 4648 中定义的未填充的备用 Base64 编码。它通常用于 URL 和文件名。这与 URLEncoding 相同,但省略了填充字符。

https://pkg.go.dev/encoding/base64

© www.soinside.com 2019 - 2024. All rights reserved.