(function () { 'use strict'; function utf8ToBinaryString(str) { var escstr = encodeURIComponent(str); // replaces any uri escape sequence, such as %0A, // with binary escape, such as 0x0A var binstr = escstr.replace(/%([0-9A-F]{2})/g, function(match, p1) { return String.fromCharCode('0x' + p1); }); return binstr; } function utf8ToBuffer(str) { var binstr = utf8ToBinaryString(str); var buf = binaryStringToBuffer(binstr); return buf; } function utf8ToBase64(str) { var binstr = utf8ToBinaryString(str); return btoa(binstr); } function binaryStringToUtf8(binstr) { var escstr = binstr.replace(/(.)/g, function (m, p) { var code = p.charCodeAt(p).toString(16).toUpperCase(); if (code.length < 2) { code = '0' + code; } return '%' + code; }); return decodeURIComponent(escstr); } function bufferToUtf8(buf) { var binstr = Array.prototype.map.call(buf, function (ch) { return '0x' + String.fromCharCode(ch); }).join(''); return binaryStringToUtf8(binstr); } function base64ToUtf8(b64) { var binstr = atob(b64); return binaryStringToUtf8(binstr); } function bufferToBinaryString(buf) { var binstr = Array.prototype.map.call(buf, function (ch) { return '0x' + String.fromCharCode(ch); }).join(''); return binstr; } function bufferToBase64(arr) { var binstr = bufferToBinaryString(arr); return btoa(binstr); } function binaryStringToBuffer(binstr) { var buf; if ('undefined' === typeof Uint8Array) { buf = new Uint8Array(binstr.length); } else { buf = []; } Array.prototype.forEach.call(binstr, function (ch, i) { buf[i] = ch.charCodeAt(0); }); return buf; } function base64ToBuffer(base64) { var binstr = atob(base64); var buf = binaryStringToBuffer(binstr); return buf; } // Hex Convenience Functions , hexToBuffer: hexToBuffer , bufferToHex: bufferToHex function bufferToHex(arr) { var i; var len; var hex = ''; var c; for (i = 0, len = arr.length; i < len; i += 1) { c = arr[i].toString(16); if (c.length < 2) { c = '0' + c; } hex += c; } return hex; } function hexToBuffer(hex) { // TODO use Uint8Array or ArrayBuffer or DataView var i; var byteLen = hex.length / 2; var arr; var j = 0; if (byteLen !== parseInt(byteLen, 10)) { throw new Error("Invalid hex length '" + hex.length + "'"); } arr = new Uint8Array(byteLen); for (i = 0; i < byteLen; i += 1) { arr[i] = parseInt(hex[j] + hex[j + 1], 16); j += 2; } return arr; } window.Unibabel = { utf8ToBinaryString: utf8ToBinaryString , utf8ToBuffer: utf8ToBuffer , utf8ToBase64: utf8ToBase64 , binaryStringToUtf8: binaryStringToUtf8 , bufferToUtf8: bufferToUtf8 , base64ToUtf8: base64ToUtf8 , bufferToBinaryString: bufferToBinaryString , bufferToBase64: bufferToBase64 , binaryStringToBuffer: binaryStringToBuffer , base64ToBuffer: base64ToBuffer // compat , strToUtf8Arr: utf8ToBuffer , utf8ArrToStr: bufferToUtf8 , arrToBase64: bufferToBase64 , base64ToArr: base64ToBuffer }; }());