common-kit
Version:
JavaScript Common Kit
69 lines (63 loc) • 2.28 kB
JavaScript
const utf8 = require('../utf8/index.js')
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
function InvalidCharacterError(message) {
this.message = message
}
InvalidCharacterError.prototype = new Error()
InvalidCharacterError.prototype.name = 'InvalidCharacterError'
// encoder
// [https://gist.github.com/999166] by [https://github.com/nignag]
function btoa(input) {
var str = String(input)
str = utf8.utf16to8(str) // 支持中文
for (
// initialize result and counter
var block, charCode, idx = 0, map = chars, output = '';
// if the next str index does not exist:
// change the mapping table to "="
// check if d has no fractional digits
str.charAt(idx | 0) || ((map = '='), idx % 1);
// "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8
output += map.charAt(63 & (block >> (8 - (idx % 1) * 8)))
) {
charCode = str.charCodeAt((idx += 3 / 4))
if (charCode > 0xff) {
throw new InvalidCharacterError(
"'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."
)
}
block = (block << 8) | charCode
}
return output
}
// decoder
// [https://gist.github.com/1020396] by [https://github.com/atk]
function atob(input) {
var str = String(input).replace(/[=]+$/, '') // #31: ExtendScript bad parse of /=
if (str.length % 4 == 1) {
throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded.")
}
for (
// initialize result and counters
var bc = 0, bs, buffer, idx = 0, output = '';
// get next character
(buffer = str.charAt(idx++));
// character found in table? initialize bit storage and add its ascii value;
~buffer &&
((bs = bc % 4 ? bs * 64 + buffer : buffer),
// and if not first of each 4 characters,
// convert the first 8 bits to one ascii character
bc++ % 4)
? (output += String.fromCharCode(255 & (bs >> ((-2 * bc) & 6))))
: 0
) {
// try to find character in table (0-63, not found => -1)
buffer = chars.indexOf(buffer)
}
output = utf8.utf8to16(output) // 支持中文
return output
}
module.exports = {
encode: btoa,
decode: atob
}