W3C home > Mailing lists > Public > whatwg@whatwg.org > August 2013

[whatwg] BinaryEncoding for Typed Arrays using window.btoa and window.atob

From: Chang Shu <cshu01@gmail.com>
Date: Mon, 5 Aug 2013 10:10:50 -0400
Message-ID: <CAMtH1gDELOJ42pWRh-FM=e66UhUM4q5p1ecUbnH8DwfMeyGzTA@mail.gmail.com>
To: whatwg@whatwg.org
Hi, all,

Based on the discussion in Blink-dev mail group,
https://groups.google.com/a/chromium.org/forum/#!searchin/blink-dev/stringview/blink-dev/ylgiNY_ZSV0/vne3e0aplUUJ,
particularly from Adam Bath's suggestion, I drafted a proposal for
binary encoding on Typed Arrays by enhancing window.btoa and atob
APIs.

The text of the proposal is pasted as below. I appreciate your kind review.

Chang

-------------------------------------------------------------------------------
BinaryEncoding

Proposed Binary Encoding Web API for Typed Arrays

Editors
Chang Shu (Samsung Electronics)

Abstract

This specification enhances the existing window.btoa and window.atob
Web APIs to encode directly from Typed Arrays to Base64 strings and
vice versa.

Use Case Description

A webapp sends data from Typed Array to NPAPI plugin and also reads
data back. Since the only possible data type supported by NPAPI to
send data buffer is text string, an efficient way of converting Typed
Array to Base64 string is required.

Current Limitations

The only existing Web API involving binary data encoding are
window.btoa and window.atob. However, they require the raw data being
contained in a 'binary' string format while in many cases the raw data
is stored in Typed Array.

Current Usage and Workarounds

Currently, converting Typed Array to 'binary' string can be done in JS
functions. But performance is not acceptable for large data buffers.

Benefits

The new enhancement of btoa and atob converts the raw data in Typed
Arrays to text string and from text string to Typed Arrays directly.
The performance is the best since all operations are done in native
code.

Requests for this Feature

I would like this feature to be implemented and shipped.

Proposed Solutions

My Solution

The approach is to enhance existing btoa and atob to take Typed Array
parameters while keeping backward compatibility.

window.btoa

Summary

Creates a base-64 encoded ASCII string from either a "string" of
binary data or a Typed Array.

Syntax

var encodedData = window.btoa(dataToEncode);

Note that there is no syntax change in window.btoa API.

Example

var encodedData = window.btoa("hello"); //encode a string. Consider
the string as 'binary'

var arr = new Int32Array(3);
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
var encodedData = window.btoa(arr); //encode integer data into a base-64 string

window.atob

Summary

Decodes a base-64 encoded ASCII string into a "string" of binary data
and a Typed Array if parameter provided.

Syntax

var decodedArr = new Int32Array();
var decodedData = window.atob(encodedData, [Optinoal] decodedArr);

Note that the 2nd parameter is optional which keeps the backward compatibility.

Example

var arr = new Int32Array(3);
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
var encodedData = window.btoa(arr); //encode integer data into a base-64 string

var newarr = new Int32Array();
window.atob(encodedData, newarr); //decode base-64 string back to integer array
//newarr[0] should be 1, newarr[1] should be 2 and newarr[2] should be 3.
Received on Monday, 5 August 2013 14:11:19 UTC

This archive was generated by hypermail 2.3.1 : Monday, 13 April 2015 23:09:23 UTC