user10576882
user10576882

Reputation:

How to check if a string is base32 encoded in javascript

I need to check if a geohash string is valid, so I need to check if it's a base32 or not.

Upvotes: 3

Views: 5530

Answers (3)

MarchonaX
MarchonaX

Reputation: 26

//I put together this little HTML & js button to mess around with.

<!DOCTYPE html>
<html>
  <head>
    <title>Base32/Base64 Checker</title>
  </head>
  <body>
    <h1>Base32/Base64 Checker</h1>
    <label for="input">Enter a string:</label>
    <input type="text" id="input" name="input"><br><br>
    <button onclick="check()">Check</button>
    <p id="result"></p>

    <script>
      function check() {
        var input = document.getElementById("input").value;
        var isBase32 = /^[A-Z2-7]+=*$/.test(input);
        var isBase64 = /^[A-Za-z0-9+/]+=*$/i.test(input);
        var result;

        if (isBase32) {
          result = "The input is Base32 encoded.";
        } else if (isBase64) {
          result = "The input is Base64 encoded.";
        } else {
          result = "Neither Base32 nor Base64 !.";
        }

        document.getElementById("result").innerHTML = result;
      }
    </script>
  </body>
</html>

Upvotes: 0

function isBase32(input) {
    const regex = /^([A-Z2-7=]{8})+$/
    return regex.test(input)
}

console.log(isBase32('ABCDE23=')) //true
console.log(isBase32('aBCDE23=')) //false

console.log(isBase32('')) //false
console.log(isBase32()) //false
console.log(isBase32(null)) //false

console.log(isBase32('ABCDE567ABCDE2==')) //true
console.log(isBase32('NFGH@#$aBCDE23==')) //false

Upvotes: 3

Stephen P
Stephen P

Reputation: 14800

Base32 uses A-Z and 2-7 for the encoding, and adds a padding character = to get a multiple of 8 characters, so you can create a regex to see if the candidate string matches.

Using regex.exec a matching string will return the match information, a non-matching string will return null, so you can use an if to test whether a match is true or false.

Base32 encodings also must always be a length that is a multiple of 8, and are padded with enough = chars to make it so; you can check the length is correct by using mod 8 --
if (str.length % 8 === 0) { /* then ok */ }

// A-Z and 2-7 repeated, with optional `=` at the end
let b32_regex = /^[A-Z2-7]+=*$/;

var b32_yes = 'AJU3JX7ZIA54EZQ=';
var b32_no  = 'klajcii298slja018alksdjl';
    
if (b32_yes.length % 8 === 0 &&
    b32_regex.exec(b32_yes)) {
    console.log("this one is base32");
}
else {
    console.log("this one is NOT base32");
}
    
if (b32_no % 8 === 0 &&
    b32_regex.exec(b32_no)) {
    console.log("this one is base32");
}
else {
    console.log("this one is NOT base32");
}

Upvotes: 2

Related Questions