Base64编码不会因无效字符而失败

时间:2018-10-30 14:32:22

标签: go encoding base64

我正在尝试确保来自http请求的字符串在base64 url​​参数中有效。我一直在尝试base64.RawURLEncoding,因为我认为编码无效的字符串会引发err,或者至少解码其结果会失败,但是无论输入如何,它都非常愉快地对字符串进行编码/解码。

https://play.golang.org/p/3sHUfl2NSJK

我创建了上面的游乐场,显示了我遇到的问题(尽管是一个极端的例子)。还有另一种确定字符串是否完全由有效的base64字符组成的方法吗?

2 个答案:

答案 0 :(得分:1)

base64编码的工作原理是将任意位流解释为6位整数的字符串,然后将其一一映射到所选的base64字母。

您的示例字符串以以下8位字节开头:

more = 'yes'
shopping_list = []
while more == 'yes':
    user_input = input('Enter a product:')
    user_quantity = int(input('Enter the number of products:'))
    if user_input in formatted_data:
        get_price_of_product=formatted_data[user_input]
        get_quantity=user_quantity
        amount=get_price_of_product * get_quantity
        shopping_list.append((user_input,amount))
    else:
        print('Enter valid product name')
    more = input('Would you like more?')

将它们重新排列为6位数字:

11000010 10111010 11000010 10101010 11100010 10000000

并将它们映射到base64字母(此处为URL编码):

110000 101011 101011 000010 101010 101110 001010 000000

由于每个6位数字都可以映射到字母中的一个字符(正好有64个数字),因此没有无效的base64输入。这正是base64的用途:将任意输入转换为可打印的ASCII字符。

另一方面,如果输入包含base64字母之外的字节,则

De 编码可能并且将失败—无法将它们映射回6位整数。

答案 1 :(得分:1)

为明确起见,Base64是一种编码方案,它允许您获取任意二进制数据并将其安全地编码为ASCII字符,然后可以将其解码为原始二进制字符串。

这意味着“ Base64- en 代码”操作实际上可以接受任何输入并产生有效的编码数据。但是,如果“ Base64- de 代码”操作的输入字符串包含该编码使用的ASCII字符集以外的字符,则该操作将失败(这意味着给定的字符串不是 由有效的Base64编码器生成。)

要测试字符串是否包含有效的Base64编码序列,只需调用base64.Encoding.DecodeString(...)并测试错误是否为“ nil”。

例如(Go Playground):

func IsValidBase64(s string) bool {
  _, err := base64.StdEncoding.DecodeString(s)
  return err == nil
}

func main() {
  ss := []string{"ABBA", "T0sh", "Foo=", "Bogus\x01"}

  for _, s := range ss {
    if IsValidBase64(s) {
      fmt.Printf("OK: valid Base64 %q\n", s)
    } else {
      fmt.Printf("ERR: invalid Base64 %q\n", s)
    }
  }
  // OK: valid Base64 "ABBA"
  // OK: valid Base64 "T0sh"
  // OK: valid Base64 "Foo="
  // ERR: invalid Base64 "Bogus\x01"
}
相关问题