Skip to content

Instantly share code, notes, and snippets.

@claus
Created August 25, 2021 19:12
Show Gist options
  • Select an option

  • Save claus/bbef95e30e4336411c924e7603dd6138 to your computer and use it in GitHub Desktop.

Select an option

Save claus/bbef95e30e4336411c924e7603dd6138 to your computer and use it in GitHub Desktop.

Revisions

  1. claus revised this gist Aug 25, 2021. No changes.
  2. claus created this gist Aug 25, 2021.
    60 changes: 60 additions & 0 deletions base64fixer.js
    Original 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);