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

l3zydbqr  于 2023-03-16  发布在  Go
关注(0)|答案(3)|浏览(239)

有一种方法可以将字符串编码为Base64或从Base64解码字符串,而不需要在字符串末尾添加填充符?我指的是“==”结尾。
我使用base64.URLEncoding.EncodeToString来编码,它工作得很好,但是我没有看到一种方法来决定在结尾不使用填充(就像java一样)。

v9tzhpje

v9tzhpje1#

Go1.5将在Encoding上有一个WithPadding选项。
这也将添加2个预定义编码RawStdEncodingRawURLEncoding,它们将没有填充。
虽然你使用的是应用引擎,暂时还不能访问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
}
ruarlubt

ruarlubt2#

简单地说,
使用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.
6ljaweal

6ljaweal3#

编码:

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

去Playground:https://go.dev/play/p/TAZgLMSSe-K

相关问题