Base64 decoding script
Posted: Wed Jul 13, 2022 2:55 am
Hello. Perhaps somebody would find this useful some day. I googled around and did not find any ready solution, so here it is - a script to decode base64 back into original string. (I needed it to decode some data I "/fetch" from remote host)
If you know how to make it better (ie. get rid of that ugly "int2chr", please post your solution.
If you know how to make it better (ie. get rid of that ugly "int2chr", please post your solution.
Code: Select all
:global int2chr do={
:local symbolsHex {"\00";"\01";"\02";"\03";"\04";"\05";"\06";"\07";"\08";"\09";"\0A";"\0B";"\0C";"\0D";"\0E";"\0F";"\10";"\11";"\12";"\13";"\14";"\15";"\16";"\17";"\18";"\19";"\1A";"\1B";"\1C";"\1D";"\1E";"\1F";"\20";"\21";"\22";"\23";"\24";"\25";"\26";"\27";"\28";"\29";"\2A";"\2B";"\2C";"\2D";"\2E";"\2F";"\30";"\31";"\32";"\33";"\34";"\35";"\36";"\37";"\38";"\39";"\3A";"\3B";"\3C";"\3D";"\3E";"\3F";"\40";"\41";"\42";"\43";"\44";"\45";"\46";"\47";"\48";"\49";"\4A";"\4B";"\4C";"\4D";"\4E";"\4F";"\50";"\51";"\52";"\53";"\54";"\55";"\56";"\57";"\58";"\59";"\5A";"\5B";"\5C";"\5D";"\5E";"\5F";"\60";"\61";"\62";"\63";"\64";"\65";"\66";"\67";"\68";"\69";"\6A";"\6B";"\6C";"\6D";"\6E";"\6F";"\70";"\71";"\72";"\73";"\74";"\75";"\76";"\77";"\78";"\79";"\7A";"\7B";"\7C";"\7D";"\7E";"\7F";"\80";"\81";"\82";"\83";"\84";"\85";"\86";"\87";"\88";"\89";"\8A";"\8B";"\8C";"\8D";"\8E";"\8F";"\90";"\91";"\92";"\93";"\94";"\95";"\96";"\97";"\98";"\99";"\9A";"\9B";"\9C";"\9D";"\9E";"\9F";"\A0";"\A1";"\A2";"\A3";"\A4";"\A5";"\A6";"\A7";"\A8";"\A9";"\AA";"\AB";"\AC";"\AD";"\AE";"\AF";"\B0";"\B1";"\B2";"\B3";"\B4";"\B5";"\B6";"\B7";"\B8";"\B9";"\BA";"\BB";"\BC";"\BD";"\BE";"\BF";"\C0";"\C1";"\C2";"\C3";"\C4";"\C5";"\C6";"\C7";"\C8";"\C9";"\CA";"\CB";"\CC";"\CD";"\CE";"\CF";"\D0";"\D1";"\D2";"\D3";"\D4";"\D5";"\D6";"\D7";"\D8";"\D9";"\DA";"\DB";"\DC";"\DD";"\DE";"\DF";"\E0";"\E1";"\E2";"\E3";"\E4";"\E5";"\E6";"\E7";"\E8";"\E9";"\EA";"\EB";"\EC";"\ED";"\EE";"\EF";"\F0";"\F1";"\F2";"\F3";"\F4";"\F5";"\F6";"\F7";"\F8";"\F9";"\FA";"\FB";"\FC";"\FD";"\FE";"\FF"};
:return ($symbolsHex->[:tonum $1])
}
:global base64decode do={
:global int2chr
:local encoded $1;
:local decoded ""
:local b64 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
for pos from=0 to=([len $encoded]-1) step=4 do={
:local part [:pick $encoded $pos ($pos+4)]
:local n 0
:local idx 0
for step from=0 to=4 step=1 do={
:local c [:pick $part $step ($step+1)]
:set idx [:find $b64 $c 0]
:set $n ($n + ($idx << (18-$step*6)))
}
for shift from=16 to=0 step=-8 do={
:local asciicode (($n >> $shift) & 255)
:set $decoded ($decoded . [$int2chr $asciicode])
}
}
:return $decoded
}
{
:local data2 "dGhpcyBpcyBzYW1wbGUgdGV4dCwgZW5jb2RlZCBpbnRvIGJhc2U2NCBmb3IgZnVuIGFuZCBwcm9maXQh"
:put "encoded: $data2"
:local decoded [$base64decode $data2]
:put "decoded: $decoded"
}