import { int2char } from "./util";
|
var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
var b64pad = "=";
|
export function hex2b64(h) {
|
var i;
|
var c;
|
var ret = "";
|
for (i = 0; i + 3 <= h.length; i += 3) {
|
c = parseInt(h.substring(i, i + 3), 16);
|
ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);
|
}
|
if (i + 1 == h.length) {
|
c = parseInt(h.substring(i, i + 1), 16);
|
ret += b64map.charAt(c << 2);
|
}
|
else if (i + 2 == h.length) {
|
c = parseInt(h.substring(i, i + 2), 16);
|
ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);
|
}
|
while ((ret.length & 3) > 0) {
|
ret += b64pad;
|
}
|
return ret;
|
}
|
// convert a base64 string to hex
|
export function b64tohex(s) {
|
var ret = "";
|
var i;
|
var k = 0; // b64 state, 0-3
|
var slop = 0;
|
for (i = 0; i < s.length; ++i) {
|
if (s.charAt(i) == b64pad) {
|
break;
|
}
|
var v = b64map.indexOf(s.charAt(i));
|
if (v < 0) {
|
continue;
|
}
|
if (k == 0) {
|
ret += int2char(v >> 2);
|
slop = v & 3;
|
k = 1;
|
}
|
else if (k == 1) {
|
ret += int2char((slop << 2) | (v >> 4));
|
slop = v & 0xf;
|
k = 2;
|
}
|
else if (k == 2) {
|
ret += int2char(slop);
|
ret += int2char(v >> 2);
|
slop = v & 3;
|
k = 3;
|
}
|
else {
|
ret += int2char((slop << 2) | (v >> 4));
|
ret += int2char(v & 0xf);
|
k = 0;
|
}
|
}
|
if (k == 1) {
|
ret += int2char(slop << 2);
|
}
|
return ret;
|
}
|
// convert a base64 string to a byte/number array
|
export function b64toBA(s) {
|
// piggyback on b64tohex for now, optimize later
|
var h = b64tohex(s);
|
var i;
|
var a = [];
|
for (i = 0; 2 * i < h.length; ++i) {
|
a[i] = parseInt(h.substring(2 * i, 2 * i + 2), 16);
|
}
|
return a;
|
}
|