infinity base converter logic

1/0.
converter/encoder/decoderを使用可能。
ドリフトなし、係数から計算。

converter

define Array.prototype

1. declare values
const 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 vs

encoder

true===!!c, encoder, decoder

1. declare power, mask
const p=cs.length.toNumberOfTrailingZeros(),m=cs.length-1

true===!!c, encoder

2. declare length, index, buffer
let l=0,i=p>>>p.toNumberOfTrailingZeros()<<3,b

3. declare values
const vs=new Array((i+(v.length<<3)-1)/i<<(i/p).toNumberOfTrailingZeros()).fill(c)

4. initialize index
i=0

5. 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, buffer
let l=0,i=0,b

3. declare values
const vs=new Uint8Array((v=v.replace(RegExp(`[${c}]*$`),``)).length*p>>>3)

4. initialize index
none

5. 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
none

7. return
return vs

false===!!c, encoder, decoder

1. declare values
const vs=[]

false===!!c, encoder

2. loop
for(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. loop
for(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)