var hex2bin = function hex2bin(s) {
var ret = []
, i = 0
, l = s.length
, c, k
;
for ( ; i < l; i += 2 ) {
c = parseInt(s.substr(i, 1), 16);
k = parseInt(s.substr(i+1, 1), 16);
if(isNaN(c) || isNaN(k)) return false;
ret.push( (c << 4) | k );
}
return arr2str(ret);
};
var bin2text = function bin2text(bin) {
return base64.byteUrlEncode(bin);
};
var text2bin = function text2bin(text) {
return base64.byteUrlDecode(text);
};
var strxor = function strxor($a,$b) {
var a = $a ? String($a) : ''
, b = $b ? String($b) : ''
, m = a.length
, n = b.length
, ret = []
;
if(m != n) {
if(!m || !n) return a + b;
if(n < m) {
b = str_repeat(b, floor(m / n)) . b.substr(0, m % n);
n = m;
}
else {
a = str_repeat(a, floor(n / m)) . a.substr(0, n % m);
}
}
for(m=0;m<n;m++) ret[m] = a.charCodeAt(m) ^ b.charCodeAt(m);
return arr2str(ret);
};
var packIP4 = function packIP4(ip) {
ip = String(ip).split('.');
var r = []
, l = ip.length
, i = 0
, hasNaN
, t
;
for ( ; i<l; i++ ) {
t = parseInt(ip[i]);
if ( isNaN(t) ) {
hasNaN = true;
continue;
}
r.push(t & 0xFF);
}
if ( hasNaN && r.length == 0 ) return false;
r = arr2str(r);
return r;
};
var packInt = function packInt($int) {
var r = [];
if(typeof $int === 'string') {
$int = $int.replace(/^[0.]+/, '');
if($int.length > INT_LEN) {
for(var i = 0, l = $int.length; i<l; i += INT_LEN) {
r.push(packInt($int.substr(i, INT_LEN)|0));
}
return r.join('');
}
$int = parseInt($int);
if ( isNaN($int) ) return false;
}