149 lines
3.0 KiB
JavaScript
149 lines
3.0 KiB
JavaScript
|
(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
|
||
|
};
|
||
|
|
||
|
}());
|