Created
August 25, 2021 19:12
-
-
Save claus/bbef95e30e4336411c924e7603dd6138 to your computer and use it in GitHub Desktop.
Fixes base64 casing in case it got lost
This file contains hidden or 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
const b64alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; | |
const b64 = 'd2ugzwnobyb3zsbly2hvihdligvjag8gd2ugzwnobyb3zsbly2hvihdligvjag8gcndligvjag8gd2ugsgvsbg8/igvjag8gd2ugzwnobyb3zsbly2hvihdligvjag8gd2ugzwnobyakd2ugzwnobyb3zsbly2hvifdlignhbibtyxlizsbzzw5kigegbwvzc2fnzsb3zsakd2ugzwnobyb3zsbly2hvihdligvjag8gd2ugzwnobyb3zsbly2hvihdligvjag8gcndligvjag8gd2ugzwnobyb3zsb3agvyzsbhcmugd2u/igvjag8gd2ugzwnobyakd2ugzwnobyb3zsbzb21lag93igvjag8gd2ugzwnobyb3zsbly2hvihdligvjag8gcndligvjag8gd2ugzwnobyb3zsbly2hvihdligvjag8gd2ugzwnobyb3zsbly2hviap3zsbly2hviekgc2vligegbglnahqgynv0igl0j3mgzg9lc250igxvb2sgcmlnahqgiap3zsbly2hvihdligvjag8gd2ugzwnobyb3zsbly2hvihdligvjag8gd2ugzwnobyakd2ugzwnobyb3zsbly2hvienhbib5b3ugagvhcibtzt8gd2ugzwnobyb3zsbly2hvia=='.toUpperCase(); | |
const b64arr = b64.split(''); | |
function getBestMatch(quad) { | |
const scores = []; | |
let cancelled = false; | |
for (let i = 0; i < 16; i++) { | |
const bin = i.toString(2).padStart(4, '0'); | |
const res = new Array(3).fill(0); | |
let resb64 = ''; | |
for (let j = 0; j < 4; j++) { | |
try { | |
const b = bin[j] === '0' ? quad[j].toLowerCase() : quad[j]; | |
const b6 = b64alphabet.indexOf(b); | |
if (j === 0) { | |
res[0] = b6 << 2; // 543210xx | |
} else if (j === 1) { | |
res[0] = res[0] | (b6 >> 4); // xxxxxx54 | |
res[1] = (b6 << 4) & 255; // 3210xxxx | |
} else if (j === 2) { | |
res[1] = res[1] | (b6 >> 2); // xxxx5432 | |
res[2] = (b6 << 6) & 255; // 10xxxxxx | |
} else if (j === 3) { | |
res[2] = res[2] | b6; // xx543210 | |
} | |
resb64 += b; | |
} catch (e) { | |
console.log(`cancelled ${i} ${j}`); | |
cancelled = true; | |
j = 4; | |
i = 16; | |
} | |
} | |
const score = res.reduce((a, v) => { | |
return v >= 0x20 && v <= 0x7a ? a + 1 : a; | |
}, 0); | |
scores.push({ | |
score, | |
res, | |
resb64, | |
}); | |
} | |
const best = scores.sort((a, b) => b.score - a.score)[0]; | |
return { ...best, cancelled }; | |
} | |
let pos = 0; | |
let resultb64 = ''; | |
while (pos < b64arr.length) { | |
const quad = b64arr.slice(pos, pos + 4); | |
const best = getBestMatch(quad); | |
if (best.cancelled) { | |
console.log(`cancelled at ${pos} from ${b64arr.length}`) | |
} | |
resultb64 += best.resb64; | |
pos += 4; | |
} | |
console.log(resultb64); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment