Last active
September 11, 2021 04:41
-
-
Save sergeevabc/f20d49ee3bda647aed39 to your computer and use it in GitHub Desktop.
Base32 Crockford's edition https://github.com/agnoster/base32-js 0123456789abcdefghjkmnpqrtuvwxyz
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(function () { | |
var alphabet = '0123456789abcdefghjkmnpqrtuvwxyz'; | |
var alias = { | |
o: 0, | |
i: 1, | |
l: 1, | |
s: 5 | |
}; | |
var lookup = function () { | |
var table = {}; | |
for (var i = 0; i < alphabet.length; i++) { | |
table[alphabet[i]] = i; | |
} | |
for (var key in alias) { | |
if (!alias.hasOwnProperty(key)) | |
continue; | |
table[key] = table['' + alias[key]]; | |
} | |
lookup = function () { | |
return table; | |
}; | |
return table; | |
}; | |
function Encoder() { | |
var skip = 0; | |
var bits = 0; | |
this.output = ''; | |
this.readByte = function (byte) { | |
if (typeof byte == 'string') | |
byte = byte.charCodeAt(0); | |
if (skip < 0) { | |
bits |= byte >> -skip; | |
} else { | |
bits = byte << skip & 248; | |
} | |
if (skip > 3) { | |
skip -= 8; | |
return 1; | |
} | |
if (skip < 4) { | |
this.output += alphabet[bits >> 3]; | |
skip += 5; | |
} | |
return 0; | |
}; | |
this.finish = function (check) { | |
var output = this.output + (skip < 0 ? alphabet[bits >> 3] : '') + (check ? '$' : ''); | |
this.output = ''; | |
return output; | |
}; | |
} | |
Encoder.prototype.update = function (input, flush) { | |
for (var i = 0; i < input.length;) { | |
i += this.readByte(input[i]); | |
} | |
var output = this.output; | |
this.output = ''; | |
if (flush) { | |
output += this.finish(); | |
} | |
return output; | |
}; | |
function Decoder() { | |
var skip = 0; | |
var byte = 0; | |
this.output = ''; | |
this.readChar = function (char) { | |
if (typeof char != 'string') { | |
if (typeof char == 'number') { | |
char = String.fromCharCode(char); | |
} | |
} | |
char = char.toLowerCase(); | |
var val = lookup()[char]; | |
if (typeof val == 'undefined') { | |
return; | |
} | |
val <<= 3; | |
byte |= val >>> skip; | |
skip += 5; | |
if (skip >= 8) { | |
this.output += String.fromCharCode(byte); | |
skip -= 8; | |
if (skip > 0) | |
byte = val << 5 - skip & 255; | |
else | |
byte = 0; | |
} | |
}; | |
this.finish = function (check) { | |
var output = this.output + (skip < 0 ? alphabet[bits >> 3] : '') + (check ? '$' : ''); | |
this.output = ''; | |
return output; | |
}; | |
} | |
Decoder.prototype.update = function (input, flush) { | |
for (var i = 0; i < input.length; i++) { | |
this.readChar(input[i]); | |
} | |
var output = this.output; | |
this.output = ''; | |
if (flush) { | |
output += this.finish(); | |
} | |
return output; | |
}; | |
function encode(input) { | |
var encoder = new Encoder(); | |
var output = encoder.update(input, true); | |
return output; | |
} | |
function decode(input) { | |
var decoder = new Decoder(); | |
var output = decoder.update(input, true); | |
return output; | |
} | |
var base32 = { | |
Decoder: Decoder, | |
Encoder: Encoder, | |
encode: encode, | |
decode: decode, | |
}; | |
if (typeof window !== 'undefined') { | |
window.base32 = base32; | |
} | |
if (typeof module !== 'undefined' && module.exports) { | |
module.exports = base32; | |
} | |
}()); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment