使用JavaScript确定字符串是否在base64中

时间:2011-10-22 14:55:22

标签: javascript base64

我正在使用window.atob('string')函数将字符串从base64解码为字符串。现在我想知道,有没有办法检查'string'实际上是否有效base64?如果字符串不是base64,我希望收到通知,以便我可以执行不同的操作。

11 个答案:

答案 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

  1. 它的长度可以被4整除
  2. 使用A-Z a-z 0-9 +/=
  3. 最后只使用=(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;
    }