JSFiddle - React, Tailwind, and code Playground

HTML

Encoded: <br /><textarea>10_10_70_6d_27_2f_6b_76_6a_7c_74_6c_75_7b_35_6e_6c_7b_4c_73_6c_74_6c_75_7b_7a_49_80_5b_68_6e_55_68_74_6c_2f_2e_69_76_6b_80_2e_30_62_37_64_30_82_14_10_10</textarea>
<hr />
base:      <input title="base/radix: 2 to 36" 
                   type="text" value="16" />
seperator: <input title="character(s) seperating values" 
                   type="text" value="_" />
offset:    <input title="negative: '-#' | positive: '#'" 
                   type="text" value="-7" />
<button onclick="var v=document.getElementsByTagName('input')[2];
                 v.value=Number(v.value)+1; 
                 dencode();"     >up</button>
<button onclick="dencode();"     >decode</button> 
<button onclick="dencode('enc');">encode</button> 
<hr />
Decoded: <br /><textarea></textarea>

CSS

html, body { height:100%; }
textarea   { width:99%; height:35%; }
input      { width:2em; text-align:center; 
             border:1px solid #fedfdf; background:#f7f7f7; }

JavaScript

var dencode=function(opt){
    var L = document,    enc = [],    dec = [],
        i = L.getElementsByTagName('input'),
      rad = Number(i[0].value) || 10,
      sep = i[1].value || ',',
      ofs = Number(i[2].value) || 0,
      txt = L.getElementsByTagName('textarea');

    if (opt === 'enc') {                        // encode
        dec = txt[1].value.split('');
        for (i = 0, L = dec.length; i < L; i++) {
            enc.push( (dec[i].charCodeAt(0)-ofs).toString(rad) );
        }
        txt[0].value = enc.join(sep);
    } else {                                    // decode (default)
        enc = txt[0].value.replace(/[\r\n]/gi,'').split(sep);
        for (i = 0, L = enc.length; i < L; i++) {
            dec.push(  String.fromCharCode( parseInt(enc[i],rad)+ofs )  );
        }
        txt[1].value = dec.join('');
    }
};