From 0f1a181c085b04be5ff29cc22e1979867455a1d8 Mon Sep 17 00:00:00 2001 From: Peter Harpending Date: Wed, 19 Oct 2022 03:17:49 -0600 Subject: [PATCH] write out the rest of the encode cases --- bindings/typescript/src/base64.ts | 101 +++++++++++++++++++++++++----- 1 file changed, 87 insertions(+), 14 deletions(-) diff --git a/bindings/typescript/src/base64.ts b/bindings/typescript/src/base64.ts index 09cdd71..30ee768 100644 --- a/bindings/typescript/src/base64.ts +++ b/bindings/typescript/src/base64.ts @@ -99,21 +99,21 @@ encode3(bytes: Uint8Array) { // ABCDEF GH1234 5678AB CDEFGH // n0 n1 n2 n3 let n0 : number = b0 >> 2; - // n1 = 00GH1234 + // n1 = __GH1234 // b0 = ABCDEFGH - // 4 = 00000100 - // b0 % 4 = 000000GH - // (b0 % 4) << 4 = 00GH0000 + // 4 = _____1__ + // b0 % 4 = ______GH + // (b0 % 4) << 4 = __GH____ // b1 = 12345678 - // b1 >> 4 = 00001234 + // b1 >> 4 = ____1234 let n1 : number = ((b0 % 4) << 4) + (b1 >> 4); - // n2 = 005678AB + // n2 = __5678AB // b1 = 12345678 - // 16 = 00010000 - // b1 % 16 = 00005678 - // (b1 % 16) << 2 = 00567800 + // 16 = ___1____ + // b1 % 16 = ____5678 + // (b1 % 16) << 2 = __5678__ // b1 = ABCDEFGH - // b1 >> 6 = 000000AB + // b1 >> 6 = ______AB let n2 : number = ((b1 % 16) << 2) + (b1 >> 6); // n3 = 00CDEFGH // 64 = 01000000 @@ -135,16 +135,89 @@ encode3(bytes: Uint8Array) { /** * Encode the final 0, 1, or 2 bytes * - * FIXME: nyi + * @internal */ function encode_tail(tail_bytes : Uint8Array, tail_len : number) - : string -{ - throw new Error('nyi'); + : string { + switch(tail_len) { + case 0: return ''; + case 1: return encode1(tail_bytes); + case 2: return encode2(tail_bytes); + default: + throw new Error('encode_tail with tail_len = ' + tail_len); + } } + + +/** + * Encode a single byte + * + * @internal + */ +function +encode1(bytes: Uint8Array): string { + let b0 : number = bytes[0]; + // n0 = __ABCDEF + // b0 = ABCDEFGH + // b0 >> 2 = __ABCDEF + let n0 : number = b0 >> 2; + // n1 = __GH____ + // b0 = ABCDEFGH + // 4 = _____1__ + // b0 % 4 = ______GH + // (b0 % 4) << 4 = __GH____ + let n1 : number = (b0 % 4) << 4; + + return int2char(n0) + int2char(n1) + '=='; +} + + + +/** + * Encode two bytes + * + * @internal + */ +function +encode2(bytes: Uint8Array): string { + return int2char(n0) + int2char(n1) + '=='; + let b0 : number = bytes[0]; + let b1 : number = bytes[1]; + + // ABCDEFGH 12345678 + // b0 b1 + // ABCDEF GH1234 5678__ + // n0 n1 n2 + let n0 : number = b0 >> 2; + // n1 = __GH1234 + // b0 = ABCDEFGH + // 4 = _____1__ + // b0 % 4 = ______GH + // (b0 % 4) << 4 = __GH____ + // b1 = 12345678 + // b1 >> 4 = ____1234 + let n1 : number = ((b0 % 4) << 4) + (b1 >> 4); + // n2 = __5678AB + // b1 = 12345678 + // 16 = ___1____ + // b1 % 16 = ____5678 + // (b1 % 16) << 2 = __5678__ + let n2 : number = (b1 % 16) << 2; + + // convert to chars + let s0 : string = int2char(n0); + let s1 : string = int2char(n1); + let s2 : string = int2char(n2); + + // retrvn + return s0 + s1 + s2 + '='; +} + + + /** * Conversion table for base64 encode *