【问题标题】:What is so special about 24 characters string while calling base64.StdEncoding.DecodeString调用base64.StdEncoding.DecodeString时24个字符串有什么特别之处
【发布时间】:2020-10-06 17:57:04
【问题描述】:

24 个字符长的字符串有什么特别之处?

package main

import (
    "encoding/base64"
    "fmt"
)

func main() {
    data := []string{"24CharacterStringppppppp", "aaaaaaaaaaaaaaaaaaaaaaaa", "25CharacterStringpppppppp", "23CharacterStringpppppp", "qwertyuiop"}

    for _, d := range data {
        _, err := base64.StdEncoding.DecodeString(d)

        if err != nil {
            fmt.Printf("Failed to decode base 64 string %v, err: %v \n", d, err.Error())

        } else {
            fmt.Printf("No Error\n")
        }
    }
}

我只是偶然发现了这一点,任何 24 个字符长的字符串都不会产生错误,而调用 base64.StdEncoding.DecodeString 任何其他长度的字符串都会产生错误。

我错过了什么?

【问题讨论】:

标签: string go base64


【解决方案1】:

Wikipedia: Base64:

因为 Base64 是 6 位编码,并且由于解码后的值在现代计算机上被分为 8 位八位字节,因此 Base64 编码文本的每四个字符(4 个六位字节 = 46 = 24 位)表示三个八位字节的未编码文本或数据(3 个八位字节 = 38 = 24 位)。 这意味着当未编码输入的长度不是三的倍数时,编码后的输出必须添加填充,使其长度为四的倍数。

24 是 4 的倍数,但 23 或 25 不是。但是如果再增加 4 个字符,28 又是 4 的倍数,这也不会产生错误。

例如,这些输入都生成"No Error"(在Go Playground 上尝试):

data := []string{"", "1234", "12345678", "123456789012"}

【讨论】:

  • 惊人的例子!就我而言,这个级别的 base64 已经为我抽象了。我从中学到了一些东西 :) 一个包含大量知识的可爱(简洁)示例。干杯。
猜你喜欢
  • 1970-01-01
  • 2011-04-18
  • 2017-02-19
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2014-08-19
相关资源
最近更新 更多