Created
August 25, 2021 19:12
-
-
Save claus/bbef95e30e4336411c924e7603dd6138 to your computer and use it in GitHub Desktop.
Revisions
-
claus revised this gist
Aug 25, 2021 . No changes.There are no files selected for viewing
-
claus created this gist
Aug 25, 2021 .There are no files selected for viewing
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 charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,60 @@ 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);