diff --git a/index.d.ts b/index.d.ts index ee8d420..87416d1 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,4 +1,4 @@ declare module 'base64-arraybuffer' { export function encode(buffer: ArrayBuffer): string; - export function decode(str: string): ArrayBuffer; + export function decode(str: string, start?: number): ArrayBuffer; } diff --git a/lib/base64-arraybuffer.js b/lib/base64-arraybuffer.js index e6b6306..0cbf9a7 100644 --- a/lib/base64-arraybuffer.js +++ b/lib/base64-arraybuffer.js @@ -36,9 +36,13 @@ return base64; }; - exports.decode = function(base64) { - var bufferLength = base64.length * 0.75, - len = base64.length, i, p = 0, + exports.decode = function(base64, start) { + var len = base64.length + var i = 0; + if(start < len && start > 0) i = start; + else if(start > len) i = len; + + var bufferLength = (len - i) * 0.75, p = 0, encoded1, encoded2, encoded3, encoded4; if (base64[base64.length - 1] === "=") { @@ -51,7 +55,7 @@ var arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer); - for (i = 0; i < len; i+=4) { + for (i; i < len; i+=4) { encoded1 = lookup[base64.charCodeAt(i)]; encoded2 = lookup[base64.charCodeAt(i+1)]; encoded3 = lookup[base64.charCodeAt(i+2)]; diff --git a/test/base64-arraybuffer_test.js b/test/base64-arraybuffer_test.js index 76d22ae..5823d3f 100644 --- a/test/base64-arraybuffer_test.js +++ b/test/base64-arraybuffer_test.js @@ -52,5 +52,7 @@ describe('decode', () => { it('decode "Man"', () => ok(testArrayBuffers(decode("TWFu"), stringArrayBuffer("Man")))); it('decode "Hello world"', () => ok(testArrayBuffers(decode("SGVsbG8gd29ybGQ="), stringArrayBuffer("Hello world")))); it('decode "Hello worlds!"', () => ok(testArrayBuffers(decode("SGVsbG8gd29ybGRzIQ=="), stringArrayBuffer("Hello worlds!")))); + it('decode "Hello world" - discard start < 0', () => ok(testArrayBuffers(decode("SGVsbG8gd29ybGQ=", -1), stringArrayBuffer("Hello world")))); + it('decode "Hello world" after header when start < length', () => ok(testArrayBuffers(decode("data:image/bmp;base64,SGVsbG8gd29ybGQ=", 22), stringArrayBuffer("Hello world")))); it('decode all binary characters', () => ok(testArrayBuffers(decode("AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w=="), rangeArrayBuffer()))); });