infinity base converter logic
1/0.converter/encoder/decoder available.
no drift, calculated from coefficient.
converter
define Array.prototype
1. declare valuesconst vs=[]2. loop
for(let v of this)for(let i=vs.length;v||0<i;v=v/d>>>0)if(i)vs[--i]=(v+=vs[i]*s)%d
else vs.unshift(v%d)3. return
return vsencoder
true===!!c, encoder, decoder
1. declare power, maskconst p=cs.length.toNumberOfTrailingZeros(),m=cs.length-1true===!!c, encoder
2. declare length, index, bufferlet l=0,i=p>>>p.toNumberOfTrailingZeros()<<3,b3. declare values
const vs=new Array((i+(v.length<<3)-1)/i<<(i/p).toNumberOfTrailingZeros()).fill(c)4. initialize index
i=05. loop
for(v of v){
b=b<<8|v
l+=8
while(p-1<l)vs[i++]=cs[b>>>(l-=p)&m]
b&=m
}6. set values
if(l)vs[i]=cs[b<<p-l&m]7. return
return vs.join(``)true===!!c, decoder
2. declare length, index, bufferlet l=0,i=0,b3. declare values
const vs=new Uint8Array((v=v.replace(RegExp(`[${c}]*$`),``)).length*p>>>3)4. initialize index
none5. loop
for(v of v){
if(-1===(v=cs.indexOf(v)))return
b=b<<p|v
if(7<(l+=p)){
vs[i++]=b>>>(l-=8)
b&=m
}
}6. set values
none7. return
return vsfalse===!!c, encoder, decoder
1. declare valuesconst vs=[]false===!!c, encoder
2. loopfor(v of v)for(let i=vs.length;v||0<i;v=v/cs.length>>>0)if(i)vs[--i]=(v+=vs[i]<<8)%cs.length
else vs.unshift(v%cs.length)3. return
return reduce(false,vs,(a,v)=>a+cs[v],``)false===!!c, decoder
2. loopfor(v of v){
if(-1===(v=cs.indexOf(v)))return
for(let i=vs.length;v||0<i;v>>>=8)if(i)vs[--i]=0xff&(v+=vs[i]*cs.length)
else vs.unshift(0xff&v)
}3. return
return new Uint8Array(vs)