mirror of
https://github.com/yeicor-3d/yet-another-cad-viewer.git
synced 2025-12-19 22:24:17 +01:00
54 lines
1.4 KiB
TypeScript
54 lines
1.4 KiB
TypeScript
// B66 encoding and decoding functions for compact url query parameter values. https://gist.github.com/danneu/6755394
|
|
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.-_~";
|
|
|
|
export function b66Encode(data: Uint8Array): string {
|
|
let result = "";
|
|
let bits = 0;
|
|
let value = 0;
|
|
|
|
for (let byte of data) {
|
|
value = (value << 8) | byte;
|
|
bits += 8;
|
|
|
|
while (bits >= 6) {
|
|
bits -= 6;
|
|
result += alphabet[(value >> bits) & 0x3F];
|
|
}
|
|
}
|
|
|
|
if (bits > 0) {
|
|
result += alphabet[(value << (6 - bits)) & 0x3F];
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export function b66Decode(encoded: string): Uint8Array {
|
|
let result = [];
|
|
let bits = 0;
|
|
let value = 0;
|
|
|
|
for (let char of encoded) {
|
|
const index = alphabet.indexOf(char);
|
|
if (index === -1) {
|
|
throw new Error(`Invalid character '${char}' in B66 encoded string.`);
|
|
}
|
|
|
|
value = (value << 6) | index;
|
|
bits += 6;
|
|
|
|
while (bits >= 8) {
|
|
bits -= 8;
|
|
result.push((value >> bits) & 0xFF);
|
|
}
|
|
}
|
|
|
|
if (bits > 0) {
|
|
// If there are leftover bits, they should not be present in a valid B66 encoding.
|
|
if (value << (8 - bits)) {
|
|
throw new Error("Invalid B66 encoding: leftover bits.");
|
|
}
|
|
}
|
|
|
|
return new Uint8Array(result);
|
|
} |