我正在尝试确保来自http请求的字符串在base64 url参数中有效。我一直在尝试base64.RawURLEncoding
,因为我认为编码无效的字符串会引发err,或者至少解码其结果会失败,但是无论输入如何,它都非常愉快地对字符串进行编码/解码。>
https://play.golang.org/p/3sHUfl2NSJK
我创建了上面的游乐场,显示了我遇到的问题(尽管是一个极端的例子)。还有另一种确定字符串是否完全由有效的base64字符组成的方法吗?
答案 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"
}