Skip to content

Instantly share code, notes, and snippets.

@claus
Created August 25, 2021 19:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save claus/bbef95e30e4336411c924e7603dd6138 to your computer and use it in GitHub Desktop.
Save claus/bbef95e30e4336411c924e7603dd6138 to your computer and use it in GitHub Desktop.
Fixes base64 casing in case it got lost
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