# Base58/Base64 Number Encoding Schema in Detail ## tldr ```erlang b58_enc(Bits) -> NBits = bit_size(Bits), <> = Bits, b58_enc(BitNum, []). b58_enc(0, Acc) -> lists:map(fun b58_int2char/1, Acc); b58_enc(BitNum, Acc) -> Q = BitNum div 58, R = BitNum rem 58, b58_enc(Q, [R | Acc]). b58_dec(Str) -> Ns = lists:map(fun b58_char2int/1, Str), b58_dec(Ns, 0). b58_dec([N | Ns], Acc) -> NewAcc = (Acc*58) + N, b58_dec(Ns, NewAcc); b58_dec([], FinalAccN) -> MinNBits = trunc(math:log2(FinalAccN) + 1), NBytes = ceil(MinNBits / 8), NBits = NBytes * 8, <>. b64_enc(<>) -> CA = b64_int2char(A), CB = b64_int2char(B), CC = b64_int2char(C), CD = b64_int2char(D), [CA, CB, CC, CD | b64_enc(Rest)], b64_enc(<>) -> CA = b64_int2char(A), CB = b64_int2char(B), CC = b64_int2char(C bsl 2), [CA, CB, CC, $=]; b64_enc(<>) -> CA = b64_int2char(A), CB = b64_int2char(B bsl 4), [CA, CB, $=, $=]; b64_enc(<<>>) -> []. b64_dec(Base64_String) -> b64_dec(Base64_String, <<>>). b64_dec([W, X, $=, $=], Acc) -> NW = b64_char2int(W), NX = b64_char2int(X), <> = <>, <>; b64_dec([W, X, Y, $=], Acc) -> NW = b64_char2int(W), NX = b64_char2int(X), NY = b64_char2int(Y), <> = <>, <>; b64_dec([], Acc) -> Acc; b64_dec([W, X, Y, Z | Rest], Acc) -> NW = b64_char2int(W), NX = b64_char2int(X), NY = b64_char2int(Y), NZ = b64_char2int(Z), NewAcc = <>, b64_dec(Rest, NewAcc). ```