我正在使用window.atob('string')
函数将字符串从base64解码为字符串。现在我想知道,有没有办法检查'string'实际上是否有效base64?如果字符串不是base64,我希望收到通知,以便我可以执行不同的操作。
答案 0 :(得分:43)
如果你想检查它是否可以解码,你可以尝试解码它,看它是否失败:
try {
window.atob(str);
} catch(e) {
// something failed
// if you want to be specific and only catch the error which means
// the base 64 was invalid, then check for 'e.code === 5'.
// (because 'DOMException.INVALID_CHARACTER_ERR === 5')
}
答案 1 :(得分:20)
这应该可以解决问题。
function isBase64(str) {
if (str ==='' || str.trim() ===''){ return false; }
try {
return btoa(atob(str)) == str;
} catch (err) {
return false;
}
}
答案 2 :(得分:16)
我会使用正则表达式。试试这个:
/^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/
说明:
^ # Start of input
([0-9a-zA-Z+/]{4})* # Groups of 4 valid characters decode
# to 24 bits of data for each group
( # Either ending with:
([0-9a-zA-Z+/]{2}==) # two valid characters followed by ==
| # , or
([0-9a-zA-Z+/]{3}=) # three valid characters followed by =
)? # , or nothing
$ # End of input
答案 3 :(得分:16)
基于@ atornblad的回答,使用正则表达式对base64有效性进行简单的真/假测试就像下面这样简单:
var base64regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;
base64regex.test("SomeStringObviouslyNotBase64Encoded..."); // FALSE
base64regex.test("U29tZVN0cmluZ09idmlvdXNseU5vdEJhc2U2NEVuY29kZWQ="); // TRUE
答案 4 :(得分:13)
如果“有效”表示“只有base64字符”,请检查[A-Za-z0-9+/=]
。
如果“有效”表示“合法”的base64编码字符串,那么您应该在最后检查=
。
如果“有效”意味着它在解码后是合理的,那么它需要领域知识。
答案 5 :(得分:2)
此方法尝试解码然后编码并与原始进行比较。也可以与针对解析错误的环境的其他答案结合使用。从正则表达式的角度来看,它也可能有一个看起来像有效base64的字符串,但它不是实际的base64。
if(btoa(atob(str))==str){
//...
}
答案 6 :(得分:2)
这就是我最喜欢的验证库之一:
const notBase64 = /[^A-Z0-9+\/=]/i;
export default function isBase64(str) {
assertString(str); // remove this line and make sure you pass in a string
const len = str.length;
if (!len || len % 4 !== 0 || notBase64.test(str)) {
return false;
}
const firstPaddingChar = str.indexOf('=');
return firstPaddingChar === -1 ||
firstPaddingChar === len - 1 ||
(firstPaddingChar === len - 2 && str[len - 1] === '=');
}
https://github.com/chriso/validator.js/blob/master/src/lib/isBase64.js
答案 7 :(得分:1)
对于我来说,如果符合以下条件,则字符串可能是已编码的base64
A-Z
a-z
0-9
+/=
=
(0-3个字符)所以代码应该是
function isBase64(str)
{
return str.length % 4 == 0 && /^[A-Za-z0-9+/]+[=]{0,3}$/.test(str);
}
答案 8 :(得分:0)
由于此处发布了两种可能性(正则表达式与尝试捕获),因此我比较了两者的性能: https://jsperf.com/base64-check/
正则表达式解决方案似乎是更快,更明显的赢家。 不确定正则表达式是否能捕获所有情况,但对于我的测试而言,它运行良好。
感谢@Philzen提供正则表达式!
p.s。
如果有人有兴趣寻找最快的方法来安全地解码base64字符串(这就是我来到这里的方式): https://jsperf.com/base64-decoding-check
答案 9 :(得分:0)
我知道它来晚了,但是我试图在这里使它变得简单;
function isBase64(encodedString) {
var regexBase64 = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;
return regexBase64.test(encodedString); // return TRUE if its base64 string.
}
答案 10 :(得分:0)
在 nodejs 中实现(不仅验证允许的字符,还验证 base64 字符串)
const validateBase64 = function(encoded1) {
var decoded1 = Buffer.from(encoded1, 'base64').toString('utf8');
var encoded2 = Buffer.from(decoded1, 'binary').toString('base64');
return encoded1 == encoded2;
}