/** * @author n1474335 [n1474335@gmail.com] * @copyright Crown Copyright 2016 * @license Apache-2.0 */ import Operation from "../Operation"; import Utils from "../Utils"; /** * To Base32 operation */ class ToBase32 extends Operation { /** * ToBase32 constructor */ constructor() { super(); this.name = "To Base32"; this.module = "Default"; this.description = "Base32 is a notation for encoding arbitrary byte data using a restricted set of symbols that can be conveniently used by humans and processed by computers. It uses a smaller set of characters than Base64, usually the uppercase alphabet and the numbers 2 to 7."; this.inputType = "byteArray"; this.outputType = "string"; this.args = [ { name: "Alphabet", type: "binaryString", value: "A-Z2-7=" } ]; } /** * @param {byteArray} input * @param {Object[]} args * @returns {string} */ run(input, args) { if (!input) return ""; const alphabet = args[0] ? Utils.expandAlphRange(args[0]).join("") : "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567="; let output = "", chr1, chr2, chr3, chr4, chr5, enc1, enc2, enc3, enc4, enc5, enc6, enc7, enc8, i = 0; while (i < input.length) { chr1 = input[i++]; chr2 = input[i++]; chr3 = input[i++]; chr4 = input[i++]; chr5 = input[i++]; enc1 = chr1 >> 3; enc2 = ((chr1 & 7) << 2) | (chr2 >> 6); enc3 = (chr2 >> 1) & 31; enc4 = ((chr2 & 1) << 4) | (chr3 >> 4); enc5 = ((chr3 & 15) << 1) | (chr4 >> 7); enc6 = (chr4 >> 2) & 31; enc7 = ((chr4 & 3) << 3) | (chr5 >> 5); enc8 = chr5 & 31; if (isNaN(chr2)) { enc3 = enc4 = enc5 = enc6 = enc7 = enc8 = 32; } else if (isNaN(chr3)) { enc5 = enc6 = enc7 = enc8 = 32; } else if (isNaN(chr4)) { enc6 = enc7 = enc8 = 32; } else if (isNaN(chr5)) { enc8 = 32; } output += alphabet.charAt(enc1) + alphabet.charAt(enc2) + alphabet.charAt(enc3) + alphabet.charAt(enc4) + alphabet.charAt(enc5) + alphabet.charAt(enc6) + alphabet.charAt(enc7) + alphabet.charAt(enc8); } return output; } } export default ToBase32;