
Now write a program that takes the output of theBase64 encode data task as input and regenerate the original file.
When working on the VBA implementation I found several 'solutions' on the net, including one from the software maker himself, that showed output with incorrect padding. Obviously with incorrect padding in the output you can not decode correctly to the original file again.
BYTE FUNC FindIndex(BYTE b) IF b>='A AND b<='Z THEN RETURN (b-'A) ELSEIF b>='a AND b<='z THEN RETURN (b-'a+26) ELSEIF b>='0 AND b<='9 THEN RETURN (b-'0+52) ELSEIF b='+ THEN RETURN (62) ELSEIF b='/ THEN RETURN (63) FIRETURN (-1)PROC PrintChar(CHAR c) IF c=10 THEN PutE() ELSE Put(c) FIRETURNPROC Decode(CHAR ARRAY s) BYTE i,b1,b2,b3,b4,i1,i2,i3,i4 CHAR c IF s(0) MOD 4#0 THEN PrintE("Invalid length of string!!!") Break() FI i=1 WHILE i<=s(0) DO b1=s(i) i==+1 b2=s(i) i==+1 b3=s(i) i==+1 b4=s(i) i==+1 i1=FindIndex(b1) i2=FindIndex(b2) c=i1 LSH 2 c==%i2 RSH 4 PrintChar(c) IF b3#'= THEN i3=FindIndex(b3) c=(i2&$0F) LSH 4 c==%i3 RSH 2 PrintChar(c) IF b4#'= THEN i4=FindIndex(b4) c=(i3&$03) LSH 6 c==%i4 PrintChar(c) FI FI ODRETURNPROC Test(CHAR ARRAY s) PrintE("Encoded:") PrintE(s) PutE() PrintE("Decoded:") Decode(s) PutE()RETURNPROC Main() Test("VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo")RETURNScreenshot from Atari 8-bit computer
Encoded:VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNoDecoded:To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
withAda.Text_IO;withAWS.Translator;procedureDecode_AWSisInput:constantString:="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVw"&"IHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=";Result:constantString:=AWS.Translator.Base64_Decode(Input);beginAda.Text_IO.Put_Line(Input);Ada.Text_IO.New_Line;Ada.Text_IO.Put_Line(Result);endDecode_AWS;
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
text:"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="printdecodetext
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
#! /bin/bashdeclare-aencodeTable=(# + , - . / 0 1 2 3 4 5 6 7 8 9 :62-1-1-16352535455565758596061-1# ; < = > ? @ A B C D E F G H I J-1-1-1-1-1-10123456789# K L M N O P Q R S T U V W X Y Z10111213141516171819202122232425# [ \ ] ^ _ ` a b c d e f g h i j-1-1-1-1-1-126272829303132333435# k l m n o p q r s t u v w x y z36373839404142434445464748495051)functiona2b6(){if[$1-lt43-o$1-gt122]thenecho-1elseecho${encodeTable[$(($1-43))]}fi}functionflush(){for((k=2;k>=4-CNT;k--))do((b8=BUF>>(k*8)&255))printf-vHEX%x$b8printf\\x$HEXdone}whilereadINPUTdofor((i=0;i<${#INPUT};i++))doprintf-vNUM%d"'${INPUT:$i:1}"if((NUM==61))thenflushexit0elseDEC=$(a2b6$NUM)if((DEC>=0))then((BUF|=DEC<<6*(3-CNT)))if((++CNT==4))thenflush((CNT=0,BUF=0))fififidonedone
Using the result from theBase64 encode data task as requested, but the result is abbreviated in the code below.
data$ = "AAABAAIAEBAAAAAAAABoBQAAJgAAACAgAAAAAAAAqAgAAI4FAAAoAAAAE.......QAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAEAAAABAAAAAQAAAAE="ico$ = B64DEC$(data$)BSAVE ico$ TO "favicon.ico" SIZE LEN(ico$)
Using the temp file produced byBase64 encode data#Batch File:
certutil -f -decodehex"%temp%\favicon.tmp" favicon1.ico 1fc /B favicon.ico favicon1.ico
Input Length = 20116Output Length = 15086CertUtil: -decodehex command completed successfully.Comparing files favicon.ico and FAVICON1.ICOFC: no differences encountered
m←⌽64⋆↕4d←⌽÷256⋆↕3Decode←256|·⌊d×·+´m×⊢sym←∾"Aa0+/"+⟜↕¨26‿26‿10‿1‿1B64Dec←@+·(⌊0.75×≠)⊸⥊⟜(Decode˘↑‿4⥊⊢)64(>/⊢)sym⊐⊢B64Dec"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="
"To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich"
#include<stdio.h>#include<stdlib.h>typedefunsignedcharubyte;constubyteBASE64[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";intfindIndex(constubyteval){if('A'<=val&&val<='Z'){returnval-'A';}if('a'<=val&&val<='z'){returnval-'a'+26;}if('0'<=val&&val<='9'){returnval-'0'+52;}if(val=='+'){return62;}if(val=='/'){return63;}return-1;}intdecode(constubytesource[],ubytesink[]){constsize_tlength=strlen(source);constubyte*it=source;constubyte*end=source+length;intacc;if(length%4!=0){return1;}while(it!=end){constubyteb1=*it++;constubyteb2=*it++;constubyteb3=*it++;// might be the first padding byteconstubyteb4=*it++;// might be the first or second padding byteconstinti1=findIndex(b1);constinti2=findIndex(b2);acc=i1<<2;// six bits came from the first byteacc|=i2>>4;// two bits came from the first byte*sink++=acc;// output the first byteif(b3!='='){constinti3=findIndex(b3);acc=(i2&0xF)<<4;// four bits came from the second byteacc+=i3>>2;// four bits came from the second byte*sink++=acc;// output the second byteif(b4!='='){constinti4=findIndex(b4);acc=(i3&0x3)<<6;// two bits came from the third byteacc|=i4;// six bits came from the third byte*sink++=acc;// output the third byte}}}*sink='\0';// add the sigil for end of stringreturn0;}intmain(){ubytedata[]="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo";ubytedecoded[1024];printf("%s\n\n",data);decode(data,decoded);printf("%s\n\n",decoded);return0;}
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNoTo err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
usingSystem;usingSystem.Text;namespaceBase64DecodeData{classProgram{staticvoidMain(string[]args){vardata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=";Console.WriteLine(data);Console.WriteLine();vardecoded=Encoding.ASCII.GetString(Convert.FromBase64String(data));Console.WriteLine(decoded);}}}
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
#include<algorithm>#include<iostream>#include<string>#include<vector>typedefunsignedcharubyte;constautoBASE64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";std::vector<ubyte>encode(conststd::vector<ubyte>&source){autoit=source.cbegin();autoend=source.cend();std::vector<ubyte>sink;while(it!=end){autob1=*it++;intacc;sink.push_back(BASE64[b1>>2]);// first output (first six bits from b1)acc=(b1&0x3)<<4;// last two bits from b1if(it!=end){autob2=*it++;acc|=(b2>>4);// first four bits from b2sink.push_back(BASE64[acc]);// second outputacc=(b2&0xF)<<2;// last four bits from b2if(it!=end){autob3=*it++;acc|=(b3>>6);// first two bits from b3sink.push_back(BASE64[acc]);// third outputsink.push_back(BASE64[b3&0x3F]);// fouth output (final six bits from b3)}else{sink.push_back(BASE64[acc]);// third outputsink.push_back('=');// fourth output (1 byte padding)}}else{sink.push_back(BASE64[acc]);// second outputsink.push_back('=');// third output (first padding byte)sink.push_back('=');// fourth output (second padding byte)}}returnsink;}intfindIndex(ubyteval){if('A'<=val&&val<='Z'){returnval-'A';}if('a'<=val&&val<='z'){returnval-'a'+26;}if('0'<=val&&val<='9'){returnval-'0'+52;}if('+'==val){return62;}if('/'==val){return63;}return-1;}std::vector<ubyte>decode(conststd::vector<ubyte>&source){if(source.size()%4!=0){thrownewstd::runtime_error("Error in size to the decode method");}autoit=source.cbegin();autoend=source.cend();std::vector<ubyte>sink;while(it!=end){autob1=*it++;autob2=*it++;autob3=*it++;// might be first padding byteautob4=*it++;// might be first or second padding byteautoi1=findIndex(b1);autoi2=findIndex(b2);autoacc=i1<<2;// six bits came from the first byteacc|=i2>>4;// two bits came from the first bytesink.push_back(acc);// output the first byteif(b3!='='){autoi3=findIndex(b3);acc=(i2&0xF)<<4;// four bits came from the second byteacc|=i3>>2;// four bits came from the second bytesink.push_back(acc);// output the second byteif(b4!='='){autoi4=findIndex(b4);acc=(i3&0x3)<<6;// two bits came from the third byteacc|=i4;// six bits came from the third bytesink.push_back(acc);// output the third byte}}}returnsink;}intmain(){usingnamespacestd;stringdata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo";vector<ubyte>datav{begin(data),end(data)};cout<<data<<"\n\n"<<decode(datav).data()<<endl;return0;}
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNoTo err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
USER>Write $System.Encryption.Base64Decode("VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=")To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich(defndecode[str](String.(.decode(java.util.Base64/getDecoder)str)))(decode"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=")
"To err is human, but to really foul things up you need a computer.\n -- Paul R. Ehrlich"
Similar to theBASE64 encoding task I am using thecl-base64 library.
(eval-when(:load-toplevel:compile-toplevel:execute)(ql:quickload"cl-base64"));; * The package definition(defpackage:base64-decode(:use:common-lisp:cl-base64))(in-package:base64-decode);; * The encoded data(defvar*base64-data*"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""See BASE64-ENCODE for the origin of this data. http://rosettacode.org/wiki/Base64_encode_data");; * The function(defunbase64-decode(&optional(data*base64-data*)(file#p"favicon-2.ico"))"Returns the original FILE BASE64 encoded in DATA."(with-open-file(streamfile:direction:output:element-type'unsigned-byte:if-exists:supersede:if-does-not-exist:create)(let*((array(base64-string-to-usb8-arraydata))(len(lengtharray)))(write-sequencearraystream)(formatt"Wrote ~D bytes in file ~A~%"lenfile))))
Wrote 3638 bytes in file favicon-2.ico
require"base64"encoded_string="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="decoded_string=Base64.decode_string(encoded_string)putsdecoded_string
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
importstd.base64;importstd.stdio;voidmain(){autodata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=";writeln(data);writeln;autodecoded=cast(char[])Base64.decode(data);writeln(decoded);}
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
import'dart:convert';voidmain(){varencoded="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=";vardecoded=utf8.decode(base64.decode(encoded));print(decoded);}
To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
programBase64Decoder;{$APPTYPE CONSOLE}usesSystem.SysUtils,System.NetEncoding;constSrc='VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=';beginWriteLn(Format('Source string: '+sLineBreak+'"%s"',[Src]));WriteLn(Format('Decoded string: '+sLineBreak+'"%s"',[TNetEncoding.Base64.Decode(Src)]));end.
Source string:"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="Decoded string:"To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich"
duckdb -noheader -list <<EOF> with s as (from read_blob('favicon.ico') _(s))> select s = to_base64(s::BLOB).from_base64() from s;> EOFtrue/** * This implementation is encapsulated as Base64Format in the web.xtclang.org module, * but the module is currently in flux, so the implementation is included "inline" here. */moduleBase64{@InjectConsoleconsole;voidrun(){Stringorig=\|VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIH\|lvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=;Byte[]bytes=decode(orig);Stringtext=encode(bytes,pad=True);asserttext==orig;console.print($"base64={text}, bytes={bytes}");}staticByte[]read(Iterator<Char>stream){IntcharLen=0;charLen:=stream.knownSize();Byte[]byteBuf=newByte[](charLen*6/8);ByteprevBits=0;IntprevCount=0;while(Charch:=stream.next()){if(BytenewBits:=isBase64(ch,assertTrash=True)){if(prevCount==0){prevBits=newBits;prevCount=6;}else{byteBuf.add((prevBits<<8-prevCount)|(newBits>>prevCount-2));prevBits=newBits;prevCount-=2;}}}returnbyteBuf.freeze(True);}staticvoidwrite(Byte[]value,Appender<Char>stream,Booleanpad=False,Int?lineLength=Null){lineLength?:=Int.MaxValue;IntlineOffset=0;InttotalChars=0;ByteprevByte=0;IntprevCount=0;// number of leftover bits from the previous byteIntbyteOffset=0;IntbyteLength=value.size;while(True){// glue together the next six bits, which will create one character of outputBytesixBits;if(byteOffset>=byteLength){if(prevCount==0){break;}sixBits=prevByte<<6-prevCount;prevCount=0;}elseif(prevCount==6){sixBits=prevByte<<6-prevCount;prevCount=0;}else{BytenextByte=value[byteOffset++];sixBits=(prevByte<<6-prevCount)|(nextByte>>2+prevCount);prevByte=nextByte;prevCount+=2;}if(lineOffset>=lineLength){stream.add('\r').add('\n');totalChars+=lineOffset;lineOffset=0;}stream.add(base64(sixBits&0b111111));++lineOffset;}if(pad){totalChars+=lineOffset;for(Inti=0,IntpadCount=4-(totalChars&0b11)&0b11;i<padCount;++i){if(lineOffset>=lineLength){stream.add('\r').add('\n');lineOffset=0;}stream.add('=');++lineOffset;}}}staticStringencode(Byte[]value,Booleanpad=False,Int?lineLength=Null){// calculate buffer sizeIntbyteLen=value.size;IntcharLen=(byteLen*8+5)/6;if(pad){charLen+=4-(charLen&0b11)&0b11;}if(lineLength!=Null){charLen+=((charLen+lineLength-1)/lineLength-1).maxOf(0)*2;}StringBuffercharBuf=newStringBuffer(charLen);write(value,charBuf,pad,lineLength);returncharBuf.toString();}staticByte[]decode(Stringtext){IntcharLen=text.size;Byte[]byteBuf=newByte[](charLen*6/8);ByteprevBits=0;IntprevCount=0;for(Intoffset=0;offset<charLen;++offset){if(BytenewBits:=isBase64(text[offset],assertTrash=True)){if(prevCount==0){prevBits=newBits;prevCount=6;}else{byteBuf.add((prevBits<<8-prevCount)|(newBits>>prevCount-2));prevBits=newBits;prevCount-=2;}}}returnbyteBuf.freeze(True);}/** * Translate a single Base64 character to the least significant 6 bits of a `Byte` value. * * @param ch the Base64 character; no pad or newlines allowed * * @return the value in the range `0 ..< 64` */staticBytevalOf(Charch){returnswitch(ch){case'A'..'Z':(ch-'A').toUInt8();case'a'..'z':(ch-'a').toUInt8()+26;case'0'..'9':(ch-'0').toUInt8()+52;case'+':62;case'/':63;case'=':assertas$"Unexpected padding character in Base64: {ch.quoted()}";case'\r','\n':assertas$"Unexpected newline character in Base64: {ch.quoted()}";default:assertas$"Invalid Base64 character: {ch.quoted()}";};}/** * Translate a single Base64 character to the least significant 6 bits of a `Byte` value. * * @param ch the character to test if it is Base64 * @param assertTrash (optional) pass True to assert on illegal Base64 characters * * @return the value in the range `0 ..< 64` */staticconditionalByteisBase64(Charch,BooleanassertTrash=False){returnswitch(ch){case'A'..'Z':(True,(ch-'A').toUInt8());case'a'..'z':(True,(ch-'a').toUInt8()+26);case'0'..'9':(True,(ch-'0').toUInt8()+52);case'+':(True,62);case'/':(True,63);case'=':// "pad" sometimes allowed (or required) at endcase'\r','\n':// newlines sometimes allowed (or required)False;default:assertTrash?assertas$"Invalid Base64 character: {ch.quoted()}":False;};}/** * Convert the passed byte value to a Base64 character. * * @param the byte value, which must be in the range `0..63` * * @return the Base64 character */staticCharbase64(Bytebyte){returnswitch(byte){case0..<26:'A'+byte;case26..<52:'a'+(byte-26);case52..<62:'0'+(byte-52);case62:'+';case63:'/';default:assert:boundsas$"byte={byte}";};}}
base64=VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=, bytes=0x546F206572722069732068756D616E2C2062757420746F207265616C6C7920666F756C207468696E677320757020796F75206E656564206120636F6D70757465722E0A202020202D2D205061756C20522E204568726C696368
This solution essentially hardcodes both Base64 chars and the byte->ASCII transformation, becauseEd has no way to transform things other than text substitution. Still, the implementation is less than 200 lines long, which is a pretty compact script.
Also note that this only processes graphical chars of 7-bit ASCII—ed doesn't explicitly work with control chars. And going beyond 127 is system-dependent, so here we are.
H,pg/.*/s/\B/ /gg/\b=\b/s// 000000 /gg/\bA\b/s// 000000 /gg/\bB\b/s// 000001 /gg/\bC\b/s// 000010 /gg/\bD\b/s// 000011 /gg/\bE\b/s// 000100 /gg/\bF\b/s// 000101 /gg/\bG\b/s// 000110 /gg/\bH\b/s// 000111 /gg/\bI\b/s// 001000 /gg/\bJ\b/s// 001001 /gg/\bK\b/s// 001010 /gg/\bL\b/s// 001011 /gg/\bM\b/s// 001100 /gg/\bN\b/s// 001101 /gg/\bO\b/s// 001110 /gg/\bP\b/s// 001111 /gg/\bQ\b/s// 010000 /gg/\bR\b/s// 010001 /gg/\bS\b/s// 010010 /gg/\bT\b/s// 010011 /gg/\bU\b/s// 010100 /gg/\bV\b/s// 010101 /gg/\bW\b/s// 010110 /gg/\bX\b/s// 010111 /gg/\bY\b/s// 011000 /gg/\bZ\b/s// 011001 /gg/\ba\b/s// 011010 /gg/\bb\b/s// 011011 /gg/\bc\b/s// 011100 /gg/\bd\b/s// 011101 /gg/\be\b/s// 011110 /gg/\bf\b/s// 011111 /gg/\bg\b/s// 100000 /gg/\bh\b/s// 100001 /gg/\bi\b/s// 100010 /gg/\bj\b/s// 100011 /gg/\bk\b/s// 100100 /gg/\bl\b/s// 100101 /gg/\bm\b/s// 100110 /gg/\bn\b/s// 100111 /gg/\bo\b/s// 101000 /gg/\bp\b/s// 101001 /gg/\bq\b/s// 101010 /gg/\br\b/s// 101011 /gg/\bs\b/s// 101100 /gg/\bt\b/s// 101101 /gg/\bu\b/s// 101110 /gg/\bv\b/s// 101111 /gg/\bw\b/s// 110000 /gg/\bx\b/s// 110001 /gg/\by\b/s// 110010 /gg/\bz\b/s// 110011 /gg/\b0\b/s// 110100 /gg/\b1\b/s// 110101 /gg/\b2\b/s// 110110 /gg/\b3\b/s// 110111 /gg/\b4\b/s// 111000 /gg/\b5\b/s// 111001 /gg/\b6\b/s// 111010 /gg/\b7\b/s// 111011 /gg/\b8\b/s// 111100 /gg/\b9\b/s// 111101 /gg/\b=\b/s// 000000 /gg/\b\+\b/s// 111110 /gg/\b\/\b/s// 111111 /gg/[[:space:]]/s///gg/[01]{8}/s// & /gg/00000000/s///gg/00001010/s//\/gg/00100000/s// /gg/00100001/s//!/gg/00100010/s//"/gg/00100011/s//#/gg/00100100/s//$/gg/00100101/s//%/gg/00100110/s//&/gg/00100111/s//'/gg/00101000/s//(/gg/00101001/s//)/gg/00101010/s//*/gg/00101011/s//+/gg/00101100/s//,/gg/00101101/s//-/gg/00101110/s//./gg/00101111/s////gg/00110000/s//0/gg/00110001/s//1/gg/00110010/s//2/gg/00110011/s//3/gg/00110100/s//4/gg/00110101/s//5/gg/00110110/s//6/gg/00110111/s//7/gg/00111000/s//8/gg/00111001/s//9/gg/00111010/s//:/gg/00111011/s//;/gg/00111100/s//</gg/00111101/s//=/gg/00111110/s//>/gg/00111111/s//?/gg/01000000/s//@/gg/01000001/s//A/gg/01000010/s//B/gg/01000011/s//C/gg/01000100/s//D/gg/01000101/s//E/gg/01000110/s//F/gg/01000111/s//G/gg/01001000/s//H/gg/01001001/s//I/gg/01001010/s//J/gg/01001011/s//K/gg/01001100/s//L/gg/01001101/s//M/gg/01001110/s//N/gg/01001111/s//O/gg/01010000/s//P/gg/01010001/s//Q/gg/01010010/s//R/gg/01010011/s//S/gg/01010100/s//T/gg/01010101/s//U/gg/01010110/s//V/gg/01010111/s//W/gg/01011000/s//X/gg/01011001/s//Y/gg/01011010/s//Z/gg/01011011/s//[/gg/01011100/s//\/gg/01011101/s//]/gg/01011110/s//^/gg/01011111/s//_/gg/01100000/s//`/gg/01100001/s//a/gg/01100010/s//b/gg/01100011/s//c/gg/01100100/s//d/gg/01100101/s//e/gg/01100110/s//f/gg/01100111/s//g/gg/01101000/s//h/gg/01101001/s//i/gg/01101010/s//j/gg/01101011/s//k/gg/01101100/s//l/gg/01101101/s//m/gg/01101110/s//n/gg/01101111/s//o/gg/01110000/s//p/gg/01110001/s//q/gg/01110010/s//r/gg/01110011/s//s/gg/01110100/s//t/gg/01110101/s//u/gg/01110110/s//v/gg/01110111/s//w/gg/01111000/s//x/gg/01111001/s//y/gg/01111010/s//z/gg/01111011/s//{/gg/01111100/s//|/gg/01111101/s//}/gg/01111110/s//~/gg/[ ][ ](.)[ ][ ]/s//\1/g,pQ$ cat base64-decode.ed | ed -E base64-decode.input117VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
openSystemopenSystem.IOletencoded="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"letdecoded=Convert.FromBase64StringencodedFile.WriteAllBytes("favicon.ico",decoded)
openSystemopenSystem.IOletencoded="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"letdecode(s:string)=letchars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".ToCharArray()letfiltered=String.filter(func->Array.containscchars||c='=')sletpaddingSize=filtered|>String.filter((=)'=')|>String.lengthlets=filtered.Replace('=','A').ToCharArray()|>Array.mapintletints=chars|>Array.mapintletcalcc=letn=[c..(c+3)]|>List.sumBy(funk->Array.IndexOf(ints,s.[k])<<<(18-6*(k%4)))[16;8;0]|>List.map(funk->(n>>>k)&&&255|>char|>string)|>List.reduce(+)[0..4..Array.lengths-1]|>List.mapcalc|>List.reduce(+)|>funr->r.Substring(0,String.lengthr-paddingSize).ToCharArray()|>Array.mapbyteletdecoded=decodeencodedFile.WriteAllBytes("favicon.ico",decoded)
USING:base64iostrings;"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo"base64>>stringprint
To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
Inspired from Wikipedia. Use of a buffer.May be also of interest : github.com/lietho/base64-forth
variablebitsbuff:char>6bits( c -- u )dup43=ifdrop62exitthen( + case )dup47=ifdrop63exitthen( / case )dup4858withinif48-52+exitthen( 0-9 case )dup6591withinif65-exitthen( A-Z case )dup97123withinif97-26+exitthen( a-z case )drop0( padding );:6bitsin( v -- )bitsbuff@6lshift+bitsbuff!;:4charsin( addr -- addr+4 )$0bitsbuff!dup4+duprotdoIc@char>6bits6bitsinloop;:3bytes,( -- )bitsbuff@16rshift$ffandc,bitsbuff@8rshift$ffandc,bitsbuff@$ffandc,;:b64dec( addr1 n1 -- addr2 n2 )hererotrot( addr2 addr1 n1 )4/( addr2 addr1 n1/4 )0do4charsin3bytes,loop( addr2 addr1+4x )( get back for padding )1-dupc@61=if1else0thenswap( addr2 0|1 addr1+4x-1 )1-c@61=if1else0then+( addr2 0|1|2 )swap( 0|1|2 addr2 )duphereswap-( 0|1|2 addr2 n' )rot-( addr2 n2 );
s" VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo" b64dec cr type cr To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich ok( encode with b64enc as coded for Base64 encode data task )s" VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo" b64dec b64enc cr type VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo oks" YW55IGNhcm5hbCBwbGVhc3VyZS4=" b64dec cr type crany carnal pleasure. oks" YW55IGNhcm5hbCBwbGVhc3VyZQ==" b64dec cr type cr any carnal pleasure ok
DimSharedAsStringB64B64="ABCDEFGHIJKLMNOPQRSTUVWXYZ"&_"abcdefghijklmnopqrstuvwxyz"&_"0123456789+/"FunctionMIMEDecode(sAsString)AsIntegerIfLen(s)ThenMIMEdecode=Instr(B64,s)-1ElseMIMEdecode=-1EndIfEndFunctionFunctionDecode64(sAsString)AsStringDimAsIntegerw1,w2,w3,w4DimAsStringmDFornAsInteger=1ToLen(s)Step4w1=MIMEdecode(Mid(s,n+0,1))w2=MIMEdecode(Mid(s,n+1,1))w3=MIMEdecode(Mid(s,n+2,1))w4=MIMEdecode(Mid(s,n+3,1))Ifw2>-1ThenmD+=Chr(((w1*4+Int(w2/16))And255))Ifw3>-1ThenmD+=Chr(((w2*16+Int(w3/4))And255))Ifw4>-1ThenmD+=Chr(((w3*64+w4)And255))NextnReturnmDEndFunctionDimAsStringmsg64="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVw"&_"IHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="Printmsg64Print:Print(Decode64(msg64))Sleep
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
This reproduces the Rosetta Code icon as specified in theBase64 encode data task.
s="""iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAWJQTFRFAAAA/8IA/8EA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8UA/8UA/8QA/8IA/8IA/8IA/8IA/8IA/8IA/8MAdWVhiHJUiHJUc2Rj/8MA/8IA/8IA/8IA/8IA/8IA06QfjXZQjnZQjXVR3qwX/8IA/8IA/8IA/8IA/8IA/8kAjHVRjnZQjnZQjHVR/8gA/8IA/8IA/8IAjHVRjHVR/8gA/8IA/8IA1aYejXZQjnZQjXVR3qwX/8IA/8IA/8IA/8MAdGRjh3FVcmNj/8MA/8IA/8QA/8UA/8UA/8UA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IA/8IAjnZQ////pZF7sgAAAHN0Uk5TAAAAA5iNAjzp5DUSMTAQYPz6WBEEjPCUG8G7GZrvhkfqRTV2MUvy50Jc9FoZRUQWX/vzDau2Gab7nRi6qQwlWyZR9fJIKCMnYVBJK624GqX6nhm8C/VcGEEWYFczdXQvSvGI7O0awBeXLA9f+VY+5jiZkk/hQmMAAAABYktHRHWoapj7AAAACXBIWXMAAA3XAAAN1wFCKJt4AAAA7UlEQVQY0z1P11ICARDbFTvIKZ4HooiA7USxYMHGqRSxY6HYAAULxRr+f1zAMU+ZzCabEAnY1A50dDL9oY27uoGeXm4qbLb0WZV+YMA2KIxJHdI0u2MYcI6Maq4xE7nHAZfH6/NNTE4B0zOkz8q1f24+sLC4BCzbKLgCrK6th0Ibm1vA9g5x2DB29/br9Ug0phtxJj5QErHDhnB0nFDCTMET4PTsPJm8uLwSyzXpKQlNZ7LZm9tG6B15pKTmvn/I5QuPzbfqU7Fkf34R3+tbqSjF2FouV6pSvfZeEcatcR9S9/OL/+ey+g38tOb/AjOBNqW00PrwAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTA4LTAyVDIwOjM5OjEwKzAwOjAw98IZEQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wOC0wMlQyMDozOToxMCswMDowMIafoa0AAABGdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDYuNy44LTkgMjAxNC0wNS0xMiBRMTYgaHR0cDovL3d3dy5pbWFnZW1hZ2ljay5vcmfchu0AAAAAGHRFWHRUaHVtYjo6RG9jdW1lbnQ6OlBhZ2VzADGn/7svAAAAGHRFWHRUaHVtYjo6SW1hZ2U6OmhlaWdodAAxOTIPAHKFAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADE5MtOsIQgAAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTQzODU0Nzk1MNul3mEAAAAPdEVYdFRodW1iOjpTaXplADBCQpSiPuwAAABWdEVYdFRodW1iOjpVUkkAZmlsZTovLy9tbnRsb2cvZmF2aWNvbnMvMjAxNS0wOC0wMi8xNDBkYmM4M2RmNWY3NmQyNmIzYWNlM2ZlYTViYzI5ZS5pY28ucG5nBect2gAAAABJRU5ErkJggg=="""f = newJava["java.io.FileOutputStream", ["favicon.ico"]]f.write[base64DecodeToBytes[s]]f.close[]
include "NSlog.incl"local fn EncodeStringAsBase64( stringToEncode as CFStringRef ) as CFStringRef CFStringRef encodedBase64Str = NULL CFDataRef dataToEncode = fn StringData( stringToEncode, NSUTF8StringEncoding ) encodedBase64Str = fn DataBase64EncodedString( dataToEncode, 0 )end fn = encodedBase64Strlocal fn DecodeBase64String( base64String as CFStringRef ) as CFStringRef CFStringRef decodedString = NULL CFDataRef encodedData = fn DataWithBase64EncodedString( base64String, NSDataBase64DecodingIgnoreUnknownCharacters ) decodedString = fn StringWithData( encodedData, NSUTF8StringEncoding )end fn = decodedStringCFStringRef originalString, encodedBase64String, decodedBase64StringoriginalString = @"This is a test string to be encoded as Base64 and then decoded."NSLog( @"This is the original string:\n\t%@\n", originalString )encodedBase64String = fn EncodeStringAsBase64( originalString )NSLog( @"This is the original string encoded as Base64:\n\t%@\n", encodedBase64String )decodedBase64String = fn DecodeBase64String( encodedBase64String )NSLog( @"This is the Base64 string decoded:\n\t%@", decodedBase64String )HandleEvents
This is the original string: This is a test string to be encoded as Base64 and then decoded.This is the original string encoded as Base64: VGhpcyBpcyBhIHRlc3Qgc3RyaW5nIHRvIGJlIGVuY29kZWQgYXMgQmFzZTY0IGFuZCB0aGVuIGRlY29kZWQuThis is the Base64 string decoded: This is a test string to be encoded as Base64 and then decoded.
As images can no longer be uploaded to RC, I've encoded and decoded a string rather than the Rosetta Code icon.
packagemainimport("encoding/base64""fmt")funcmain(){msg:="Rosetta Code Base64 decode data task"fmt.Println("Original :",msg)encoded:=base64.StdEncoding.EncodeToString([]byte(msg))fmt.Println("\nEncoded :",encoded)decoded,err:=base64.StdEncoding.DecodeString(encoded)iferr!=nil{fmt.Println(err)return}fmt.Println("\nDecoded :",string(decoded))}
Original : Rosetta Code Base64 decode data taskEncoded : Um9zZXR0YSBDb2RlIEJhc2U2NCBkZWNvZGUgZGF0YSB0YXNrDecoded : Rosetta Code Base64 decode data task
importjava.nio.charset.StandardCharsetsclassDecode{staticvoidmain(String[]args){Stringdata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="Base64.Decoderdecoder=Base64.getDecoder()byte[]decoded=decoder.decode(data)StringdecodedStr=newString(decoded,StandardCharsets.UTF_8)System.out.println(decodedStr)}}
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
Simple implementation that decodes an ASCII string.
--Decodes Base64 to ASCIIimportqualifiedData.Map.StrictasMap(Map,lookup,fromList)importData.Maybe(fromJust,listToMaybe,mapMaybe)importNumeric(readInt,showIntAtBase)importData.Char(chr,digitToInt)importData.List.Split(chunksOf)byteToASCII::String->StringbyteToASCII=mapchr.decoder--generates list of bytes (represented by Int)decoder::String->[Int]decoder=mapreadBin.takeWhile(\x->lengthx==8).chunksOf8.concatMaptoBin.mapMaybe(`Map.lookup`table).filter(/='=')--turns decimal into a list of char that represents a binary numbertoBin::Int->StringtoBinn=leftPad$showIntAtBase2("01"!!)n""--this adds all the zeros to the left that showIntAtBase omittedleftPad::String->StringleftPada=replicate(6-lengtha)'0'++a--turns list of '0' and '1' into list of 0 and 1readBin::String->IntreadBin=fromJust.fmapfst.listToMaybe.readInt2(`elem`"01")digitToInt--lookup list for the sextetstable::Map.MapCharInttable=Map.fromList$zip"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[0..]main::IO()main=putStrLn$byteToASCII"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCi0tIFBhdWwgUi4gRWhybGljaA=="
To err is human, but to really foul things up you need a computer.-- Paul R. Ehrlich
or in terms of Data.ByteString.Base64:
{-# LANGUAGE OverloadedStrings #-}importqualifiedData.ByteString.Base64asBase64(decode,encode)importqualifiedData.ByteString.Char8asB(putStrLn)main::IO()main=doB.putStrLn$Base64.encode"To err is human, but to really foul things up you need a computer.\n-- Paul R. Ehrlich"B.putStrLn"\n-->\n"eitherprintB.putStrLn$Base64.decode"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCi0tIFBhdWwgUi4gRWhybGljaA=="
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCi0tIFBhdWwgUi4gRWhybGljaA==-->To err is human, but to really foul things up you need a computer.-- Paul R. Ehrlich
classMain{staticfunctionmain(){vardata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVw"+"IHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=";Sys.println('$data\n');vardecoded=haxe.crypto.Base64.decode(data);Sys.println(decoded);}}
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
using J'sconvert/misc/base64 script:
require'convert/misc/base64'frombase64'VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g='Toerrishuman,buttoreallyfoulthingsupyouneedacomputer.--PaulR.Ehrlich
Alternative implementation based on that script:
BASE64=:(a.{~,(a.i.'Aa')+/i.26),'0123456789+/'frombase64=:{{pad=._2>.(yi.'=')-#ypad}.a.{~#._8[\,(6#2)#:BASE64i.y}}
Java offers theBase64 class, which includes both theEncoder andDecoder classes.
The implementation supports RFC 4648 and RFC 2045.
Similar to the encoding process, the usage is very simple, supply abyte array, and it will return an encodedbyte array.
The class uses a static construct, so instead of instantiation via a constructor, you use one of thestatic methods.
In this case we'll use theBase64.getDecoder method to acquire our instance.
importjava.io.FileInputStream;importjava.io.IOException;importjava.util.Base64;
voiddecodeToFile(Stringpath,byte[]bytes)throwsIOException{try(FileOutputStreamstream=newFileOutputStream(path)){byte[]decoded=Base64.getDecoder().decode(bytes);stream.write(decoded,0,decoded.length);}}
The operation is successful, creating a 48 by 48-pixel, 32-bit color graphic, at 15,086 bytes.
An alternate demonstration
importjava.nio.charset.StandardCharsets;importjava.util.Base64;publicclassDecode{publicstaticvoidmain(String[]args){Stringdata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=";Base64.Decoderdecoder=Base64.getDecoder();byte[]decoded=decoder.decode(data);StringdecodedStr=newString(decoded,StandardCharsets.UTF_8);System.out.println(decodedStr);}}
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
// define base64 data; in this case the data is the string: "Hello, world!"constbase64='SGVsbG8sIHdvcmxkIQ==';// atob is a built-in function.console.log(atob(base64));
// define base64 data; in this case the data is the string: "Hello, world!"constbase64=Buffer.from('SGVsbG8sIHdvcmxkIQ==','base64');// <Buffer>.toString() is a built-in method.console.log(base64.toString());
Hello, world!
Simply pipe the base64 string into:
jq -rR @base64d
SeeBase64_encode_data#Jsish forbase64.jsi.
/* Base64 decode, in Jsish */vardata=exec('jsish base64.jsi',{retAll:true}).data;// or use File.read('stdin');varicon=Util.base64(data,true);File.write('rosetta-favicon.ico',icon);
Using an IOBuffer here, though not really needed to decode a string, shows how we could pipe a network stream or file though Julia's builtin Base64 decoder.
usingBase64io=IOBuffer()iob64_decode=Base64DecodePipe(io)write(io,"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo")seekstart(io)println(String(read(iob64_decode)))
To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
importjava.util.Base64funmain(){valdata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="valdecoder=Base64.getDecoder()valdecoded=decoder.decode(data)valdecodedStr=String(decoded,Charsets.UTF_8)println(decodedStr)}
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
-- Start taken from https://stackoverflow.com/a/35303321localb='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'-- You will need this for encoding/decoding-- decodingfunctiondec(data)data=string.gsub(data,'[^'..b..'=]','')return(data:gsub('.',function(x)if(x=='=')thenreturn''endlocalr,f='',(b:find(x)-1)fori=6,1,-1dor=r..(f%2^i-f%2^(i-1)>0and'1'or'0')endreturnr;end):gsub('%d%d%d?%d?%d?%d?%d?%d?',function(x)if(#x~=8)thenreturn''endlocalc=0fori=1,8doc=c+(x:sub(i,i)=='1'and2^(8-i)or0)endreturnstring.char(c)end))end-- end of copylocaldata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo"print(data)print()localdecoded=dec(data)print(decoded)
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNoTo err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
Load.doc handle automatic UTF16LE UTF16BE UTF8 and ANSI. Also automatic find the type of new line (here is LF)
Tempname$ retuen a unique path+filename at temporary folder. The temporary file automatic deleted when the M2000 environment closed.
inp$={VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=}tmp$=tempname$open tmp$ for wide output as #f print #f, string$(inp$ as decode64);close #fdocument a$load.doc a$, tmp$report a$clipboard a$If we know the encoding and type of line feed we can do this:
inp$={VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=}// decode inp$ (is 8-bit ANSI coded using 0xA for paragraph end/new line)a$=string$(inp$ as Decode64)locale 1033// convert ansi to utf16le using Locale 1033a$=chr$(a$) // convert to utf16LE// expand LF to CRLF for M2000 consolea$=replace$(chr$(0xA), chr$(0XD)+chr$(0XA), a$)// report handle cr and lf using proportional spacing for text and auto word wrappingreport a$ // also Print channel #-2 handle cr and lf (using non proportional spacing)print #-2, a$To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
ImportString["VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo","Base64"]
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
importbase64constSource="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="echoSource.decode()
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
'VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g='| decode base64
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
We continue from the same toplevel sessionfrom the previous page:
# let plain = Base64.decode_exn enc;;val plain : string = "\000\000\001\000\002\000\016\016\000\000\000\000\000\000h\005\000\000&\000"... (* string length 3638; truncated *)
(definebase64-codes"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")(definekernel(alist->ff(mapcons(string->bytesbase64-codes)(iota(string-lengthbase64-codes))))); returns n bits from input binary stream(define(bitsnhold)(letloop((holdhold))(vector-applyhold(lambda(vil)(cond((null?l)(values(>>v(-in))#false))((pair?l)(if(not(less?in))(values(>>v(-in))(vector(bandv(-(<<1(-in))1))(-in)l))(loop(vector(bor(<<v6)(kernel(carl)0))(+i6)(unless(eq?(carl)"=")(cdrl))))))(else(loop(vectorvi(l))))))))); decoder.(define(decodestr)(print"decoding string '"str"':")(letloop((hold[00(str-iterstr)]))(let*((bithold(bits8hold)))(unless(zero?bit)(display(stringbit)))(whenhold(loophold))))(print)(print)); TESTING(decode"SGVsbG8sIExpc3Ah")(decode"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=")(decode"TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=")
Hello, Lisp!To err is human, but to really foul things up you need a computer. -- Paul R. EhrlichMan is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.
The MIME::Base64 module is to be preferred, but this works too.
subdecode_base64{my($d)=@_;$d=~tr!A-Za-z0-9+/!!cd;$d=~s/=+$//;$d=~tr!A-Za-z0-9+/!-_!;my$r='';while($d=~ /(.{1,60})/gs){my$len=chr(32+length($1)*3/4);$r.=unpack("u",$len.$1);}$r;}$data=<<EOD;J1R3YXMgYnJpbGxpZywgYW5kIHRoZSBzbGl0aHkgdG92ZXMKRGlkIGd5cmUgYW5kIGdpbWJsZSBpbiB0aGUgd2FiZToKQWxsIG1pbXN5IHdlcmUgdGhlIGJvcm9nb3ZlcywKQW5kIHRoZSBtb21lIHJhdGhzIG91dGdyYWJlLgo=EODprintdecode_base64($data)."\n";
'Twas brillig, and the slithy tovesDid gyre and gimble in the wabe:All mimsy were the borogoves,And the mome raths outgrabe.
withjavascript_semanticsincludebuiltins\base64.estrings="Rosetta Code Base64 decode data task"stringe=encode_base64(s)?e?decode_base64(e)
"Um9zZXR0YSBDb2RlIEJhc2U2NCBkZWNvZGUgZGF0YSB0YXNr""Rosetta Code Base64 decode data task"
$encoded='VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVw'.'IHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=';echo$encoded,PHP_EOL,base64_decode($encoded),PHP_EOL;
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
(setq *Char64 `'(chop "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" ) )(de decode64 (S) (let S (chop S) (pack (make (while S (let (A (dec (index (++ S) *Char64)) B (dec (index (++ S) *Char64)) C (dec (index (++ S) *Char64)) D (dec (index (++ S) *Char64)) ) (link (char (| (>> -2 A) (>> 4 B))) ) (and C (link (char (| (>> -4 (& B 15)) (>> 2 C)) ) ) D (link (char (| (>> -6 (& C 3)) D)) ) ) ) ) ) ) ) )(prinl (decode64 "VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo"))
To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
By necessity this also implements all of the Base64 encode task toavoid a humongous amount of icon data hardcoded in the program.
stringicon=Protocols.HTTP.get_url_data("http://rosettacode.org/favicon.ico");stringencoded=MIME.encode_base64(icon);Stdio.write_file("favicon.ico",MIME.decode_base64(encoded));
The standard library already contains Base 64 encode and decode functions.
localbase64=require("base64")locals="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="print(base64.decode(s))
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
Outputting an ASCII string converted from a Base64-encoded one:
[Text.Encoding]::ASCII.GetString([Convert]::FromBase64String("VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="))
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
With the results fromBase64 encode data#PowerShell (stored in the "bytes" variable):
$bytes=...[IO.File]::WriteAllBytes('favicon.ico',[Convert]::FromBase64String($bytes))
In SWI-Prolog base64 is a built in predicate.https://www.swi-prolog.org/pldoc/doc_for?object=base64%3Abase64/2
This predicate is reversable and can encode or decode.
?- Encoded = 'VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=', base64(Plain, Encoded).Plain = 'To err is human, but to really foul things up you need a computer.\n -- Paul R. Ehrlich'.
b64cd$="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVw"+"IHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="*p_buf=AllocateMemory(1024)Base64Decoder(b64cd$,*p_buf,1024)OpenConsole(""):PrintN(PeekS(*p_buf,-1,#PB_UTF8))Input()
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
importbase64data='VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g='print(base64.b64decode(data).decode('utf-8'))
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
Option_ExplicitDimAsStringudata,decodedudata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo"decoded=decode(udata)PrintudataPrintdecodedFunctionfindIndex&(valueAs_Unsigned_Byte)IfAsc("A")<=valueAndvalue<=Asc("Z")ThenfindIndex=value-Asc("A")ExitFunctionEndIfIfAsc("a")<=valueAndvalue<=Asc("z")ThenfindIndex=value-Asc("a")+26ExitFunctionEndIfIfAsc("0")<=valueAndvalue<=Asc("9")ThenfindIndex=value-Asc("0")+52ExitFunctionEndIfIfvalue=Asc("+")ThenfindIndex=62ExitFunctionEndIfIfvalue=Asc("/")ThenfindIndex=63ExitFunctionEndIffindIndex=-1EndFunctionFunctionencode$(sourceAsString)DimAsStringBase64:Base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"DimAs_Unsigned_Integer64length:length=Len(source)DimAs_Unsigned_Integer64it,strendDimAsLongaccDimAsStringsinkstrend=lengthWhileit<>strendDimAs_Unsigned_Byteb1,b2,b3,b4it=it+1b1=Asc(Mid$(source,it,1))sink=sink+Mid$(Base64,_SHR(b1,2),1)acc=_SHL(b1And&H3,4)Ifit<>strendThenit=it+1b2=Asc(Mid$(source,it,1))acc=accOr_SHR(b2,4)sink=sink+Mid$(Base64,acc,1)acc=_SHL(b2And&HF,2)Ifit<>strendThenit=it+1b3=Asc(Mid$(source,it,1))acc=accOr_SHR(b3,6)sink=sink+Mid$(Base64,acc,1)sink=sink+Mid$(Base64,b3And&H3F,1)Elsesink=sink+Mid$(Base64,acc,1)sink=sink+"="EndIfElsesink=sink+Mid$(Base64,acc,1)sink=sink+"="sink=sink+"="EndIfWendencode=sinkEndFunctionFunctiondecode$(sourceAsString)DimAs_Unsigned_Integer64length:length=Len(source)DimAs_Unsigned_Integer64it,strendDimAsLongaccDimAsStringsinkstrend=lengthWhileit<>strendDimAs_Unsigned_Byteb1,b2,b3,b4it=it+1b1=Asc(Mid$(source,it,1))it=it+1b2=Asc(Mid$(source,it,1))it=it+1b3=Asc(Mid$(source,it,1))it=it+1b4=Asc(Mid$(source,it,1))DimAsLongi1,i2i1=findIndex(b1)i2=findIndex(b2)acc=_SHL(i1,2)acc=accOr_SHR(i2,4)sink=sink+Chr$(acc)Ifb3<>Asc("=")ThenDimAsLongi3i3=findIndex(b3)acc=_SHL(i2And&HF,4)acc=accOr_SHR(i3,2)sink=sink+Chr$(acc)Ifb4<>Asc("=")ThenDimAsLongi4i4=findIndex(b4)acc=_SHL(i3And&H3,6)acc=accOri4sink=sink+Chr$(acc)EndIfEndIfWenddecode=sinkEndFunction
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNoTo err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo"|>base64enc::base64decode()|>rawToChar()|>cat()
To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
#langracket(requirenet/urlnet/base64);; decode a string(displayln(base64-decode#"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="));; (encode and) decode the favicon(displayln(base64-decode(base64-encode(call/input-url(string->url"https://rosettacode.org/favicon.ico")get-pure-portport->bytes))))
(string output only)
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
(formerly Perl 6)
my$e64 ='VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=';my@base64map =flat'A' ..'Z','a' ..'z', ^10,'+','/';my%base64isdefault(0) =@base64map.pairs.invert;subbase64-decode-slow ($enc) {my$buf =Buf.new;for$enc.subst(/\s/,'', :g).comb(4) ->$chunck {$buf.append: |(sprintf"%06d%06d%06d%06d", |$chunck.comb.map: {%base64{$_}.base(2)}).comb(8).map: {:2($_)}; }$buf}say'Slow:';saybase64-decode-slow($e64).decode('utf8');# Of course, the above routine is slow and is only for demonstration purposes.# For real code you should use a module, which is MUCH faster and heavily tested.say"\nFast:";useBase64::Native;saybase64-decode($e64).decode('utf8');
Slow:To err is human, but to really foul things up you need a computer. -- Paul R. EhrlichFast:To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
printtostring!debase{VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo}64
Red[Source:https://github.com/vazub/rosetta-red]printto-stringdebase"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo"
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
Decode the string created by BASE64 encode (which is a draft task).
More work needed for decoding large input data!
z='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'doi=1to64bs.i=x2b(d2x(i-1))c=substr(z,i,1)ds.c=right(bs.i,6,0)Ende='YW55IGNhcm5hbCBwbGVhc3VyZS4'r=''ec=eDoWhileec<>''ParseVarecc+1ecr=r||ds.cEndres=''Dowhiler<>''ParseVarrx+8rres=res||x2c(b2x(x))EndSay'Input: >'e'<'Say'decoded: >'res'<'
Input: >YW55IGNhcm5hbCBwbGVhc3VyZS4<decoded: >any carnal pleasure.<
IncludeHow to use
IncludeSource code
The program uses a simple and straightforward string based method. Sufficient for the task, but inadequate for serious work.
Task 1 shows the Wikipedia examples. Task 2 recreates the Rosetta Code icon from the output of taskBase64 encode data.
The input favicon.dat is converted to favcopy.ico and compared (Windows) to favicon.ico.
--3Oct2025includeSettingsignaloffnotreadysay'BASE64 DECODE DATA'sayversionsaycallTask1'TWFueSBoYW5kcyBtYWtlIGxpZ2h0IHdvcmsu'callTask1'TWFu'callTask1'TWE='callTask1'TQ=='callTask1'YW55IGNhcm5hbCBwbGVhc3VyZS4='callTask2exitTask1:procedureparseargxxsay'Encoded 'xxsay'Original'Decode64(xx)sayreturnTask2:procedurein='favicon.dat';out='favcopy.ico'rr=Decode64(Charin(in,1,30000))callCharoutout,rr,1returnDecode64:procedureparseargxx--Alphabeta='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'lx=Length(xx)rr=''--Loopthruencodedcharactersdoi=1tolxc=Substr(xx,i,1)--Ifpadding,discard2bitsifc='='thendorr=Left(rr,Length(rr)-2)iterateiend--Findpositioninalphabetp=Pos(c,a)-1--Converttobitsandtakelast6b=Right(0000||X2b(D2x(p)),6)--Appendrr||=bend--ConverttocharacterreturnX2c(B2x(rr))includeAbend
BASE64 DECODE DATAREXX-Regina_3.9.7(MT) 5.00 18 Mar 2025Encoded TWFueSBoYW5kcyBtYWtlIGxpZ2h0IHdvcmsuOriginal Many hands make light work.Encoded TWFuOriginal ManEncoded TWE=Original MaEncoded TQ==Original MEncoded YW55IGNhcm5hbCBwbGVhc3VyZS4=Original any carnal pleasure.C:\Rex\Rosetta\B>comp favicon.ico favcopy.icoComparing favicon.ico and favcopy.ico...Files compare OK
#======================================## Sample: Base64 decode data # Author: Gal Zsolt, Mansour Ayouni#======================================#load "guilib.ring"oQByteArray = new QByteArray()oQByteArray.append("Rosetta Code Base64 decode data task")oba = oQByteArray.toBase64().data()see oba + nloQByteArray = new QByteArray()oQByteArray.append(oba)see oQByteArray.fromBase64(oQByteArray).data()Um9zZXR0YSBDb2RlIEJhc2U2NCBkZWNvZGUgZGF0YSB0YXNrRosetta Code Base64 decode data task
« "" DUP DUP2 → s a b c d « "" 1 s SIZEFOR j 0 3FOR k "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" s j k + DUP SUB POSNEXT 4 →LIST 1 - { a b c d } STO a 4 * b 16 / IP + CHR +IF c -1 ≠THEN b 16 MOD 16 * c 4 / IP + CHR +ENDIF d -1 ≠THEN c 4 MOD 64 * d + CHR +END 4STEP » » 'B64→' STO"VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="B64→1: "To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich"
require'base64'raku_example='VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g='putsBase64.decode64raku_example
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
usestd::str;constINPUT:&str="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo";constUPPERCASE_OFFSET:i8=-65;constLOWERCASE_OFFSET:i8=26-97;constNUM_OFFSET:i8=52-48;fnmain(){println!("Input: {}",INPUT);letresult=INPUT.chars().filter(|&ch|ch!='=')//Filter '=' chars.map(|ch|{//Map char values using Base64 Characters Tableletascii=chasi8;letconvert=matchch{'0'...'9'=>ascii+NUM_OFFSET,'a'...'z'=>ascii+LOWERCASE_OFFSET,'A'...'Z'=>ascii+UPPERCASE_OFFSET,'+'=>62,'/'=>63,_=>panic!("Not a valid base64 encoded string")};format!("{:#08b}",convert)[2..].to_string()//convert indices to binary format and remove the two first digits}).collect::<String>()//concatenate the resulting binary values.chars().collect::<Vec<char>>().chunks(8)//split into 8 character chunks.map(|chunk|{letnum_str=chunk.iter().collect::<String>();usize::from_str_radix(&num_str,2).unwrap()asu8//convert the binary string into its u8 value}).collect::<Vec<_>>();letresult=str::from_utf8(&result).unwrap();//convert into UTF-8 stringprintln!("Output: {}",result);}
Input: VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNoOutput: To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
Best seen in running your browser either byScalaFiddle (ES aka JavaScript, non JVM) orScastie (remote JVM).
importjava.util.Base64objectBase64DecodeextendsApp{deftext2BinaryDecoding(encoded:String):String={valdecoded=Base64.getDecoder.decode(encoded)newString(decoded,"UTF-8")}defdata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="println(text2BinaryDecoding(data))}
The Seed7 libraryencoding.s7i definesthe functionstoBase64 andfromBase64.
$ include "seed7_05.s7i"; include "gethttp.s7i"; include "encoding.s7i";const proc: main is func local var string: original is ""; var string: encoded is ""; begin original := getHttp("rosettacode.org/favicon.ico"); encoded := toBase64(original); writeln("Is the Rosetta Code icon the same (byte for byte) encoded then decoded: " <& fromBase64(encoded) = original); end func;Is the Rosetta Code icon the same (byte for byte) encoded then decoded: TRUE
put base64Decode ("VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuIC0tUGF1bCBSLkVocmxpY2g=")Output:
To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
vardata=<<'EOT'VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=EOTsaydata.decode_base64
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
data:='VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g='.database64DecodedasStringprintCR.
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
valdebase64=fninput=>letinfix2Worbinfix2Wandbfun(pWorbq)=Word.orb(p,q);fun(pWandbq)=Word.andb(p,q);fundecode#"/"=0wx3F|decode#"+"=0wx3E|decodec=ifChar.isDigitcthenWord.fromInt(ordc)+0wx04elseifChar.isLowercthenWord.fromInt(ordc)-0wx047elseifChar.isUppercthenWord.fromInt(ordc)-0wx041else0wx00;funconvert(a::b::c::d::_)=letvalw=Word.<<(a,0wx12)WorbWord.<<(b,0wx0c)WorbWord.<<(c,0wx06)Worbdin[Word.>>(w,0wx10),Word.>>((wWandb0wx00ff00),0wx08),wWandb0wx0000ff]end|convert_=[];fundecodeLst[]=[]|decodeLstilist=(convertomapdecode)(List.take(ilist,4))@decodeLst(List.drop(ilist,4))inString.implode(List.map(chroWord.toInt)(decodeLst(String.explodeinput)))endhandleSubscript=>"Invalid code\n";
call
val input = "VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=";print (debase64 input) ;To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
importFoundationletinput="""VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="""ifletdecoded=Data(base64Encoded:input),letstr=String(data:decoded,encoding:.utf8){print(str)}
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
packagerequiretcl8.6setdataVG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=puts[binarydecodebase64$data]
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
ModuleModule1SubMain()Dimdata="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="Console.WriteLine(data)Console.WriteLine()Dimdecoded=Text.Encoding.ASCII.GetString(Convert.FromBase64String(data))Console.WriteLine(decoded)EndSubEndModule
VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
import encoding.base64fn main() { msg := "Rosetta Code Base64 decode data task" println("Original : $msg") encoded := base64.encode_str(msg) println("\nEncoded : $encoded") decoded := base64.decode_str(encoded) println("\nDecoded : $decoded")}Original : Rosetta Code Base64 decode data taskEncoded : Um9zZXR0YSBDb2RlIEJhc2U2NCBkZWNvZGUgZGF0YSB0YXNrDecoded : Rosetta Code Base64 decode data task
From first principles using string manipulation. Quick enough here.
import"io"forStdoutimport"./fmt"forConv,Fmtimport"./str"forStrvaralpha="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"vardecode=Fn.new{|s|if(s=="")returnsvard=""for(bins){varix=alpha.indexOf(b)if(ix>=0)d=d+Fmt.swrite("$06b",ix)}if(s.endsWith("==")){d=d[0..-5]}elseif(s.endsWith("=")){d=d[0..-3]}vari=0while(i<d.count){varch=String.fromByte(Conv.atoi(d[i..i+7],2))System.write(ch)i=i+8}Stdout.flush()}vars="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g="for(chunkinStr.chunks(s,4))decode.call(chunk)System.print()
To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
func Decode(Ch);int Ch;[if Ch>=^A & Ch<=^Z then return Ch - ^A; if Ch>=^a & Ch<=^z then return Ch - ^a + 26; if Ch>=^0 & Ch<=^9 then return Ch - ^0 + 52; if Ch = ^+ then return 62; if Ch = ^/ then return 63;return -1;];char Str;int Count, N, Ch, Code, Acc;[Str:= "VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEg Y29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo ";loop [Count:= 0; for N:= 1 to 4 do \read in four 6-bit chars [repeat Ch:= Str(0); \strip out whitespace Str:= Str+1; if Ch = $A0 then quit; \terminating space until Ch > $20; Code:= Decode(Ch); Acc:= Acc<<6; if Code >= 0 then \don't count possible "=" [Acc:= Acc + Code; Count:= Count+1; ]; ]; ChOut(0, Acc>>16); \write out three 8-bit chars if Count >= 3 then ChOut(0, Acc>>8); if Count >= 4 then ChOut(0, Acc); ];]
To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
!YS-v0defn main(str):say:base64-decode(str)
$ ys base64-decode-data.ys VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLSBQYXVsIFIuIEVocmxpY2g=To err is human, but to really foul things up you need a computer. -- Paul R. Ehrlich
conststd=@import("std");constprint=std.debug.print;constArrayList=std.ArrayList;constAllocator=std.mem.Allocator;constINPUT="VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNo";constUPPERCASE_OFFSET:i8=-65;constLOWERCASE_OFFSET:i8=26-97;constNUM_OFFSET:i8=52-48;pubfnmain()!void{vargpa=std.heap.GeneralPurposeAllocator(.{}){};defer_=gpa.deinit();constallocator=gpa.allocator();print("Input: {s}\n",.{INPUT});// Create a dynamic array to collect binary stringsvarbinary_strings=ArrayList([]constu8).init(allocator);defer{for(binary_strings.items)|item|{allocator.free(item);}binary_strings.deinit();}// Process each character and convert to binaryfor(INPUT)|ch|{if(ch=='=')continue;// Filter '=' chars// Map char values using Base64 Characters Tableconstascii:i8=@intCast(ch);constconvert:u8=switch(ch){'0'...'9'=>@intCast(ascii+NUM_OFFSET),'a'...'z'=>@intCast(ascii+LOWERCASE_OFFSET),'A'...'Z'=>@intCast(ascii+UPPERCASE_OFFSET),'+'=>62,'/'=>63,else=>{print("Not a valid base64 encoded string\n",.{});return;},};// Convert to binary format (6 bits for base64)constbinary_str=trystd.fmt.allocPrint(allocator,"{b:0>6}",.{convert});trybinary_strings.append(binary_str);}// Concatenate all binary stringsvartotal_len:usize=0;for(binary_strings.items)|item|{total_len+=item.len;}constconcatenated=tryallocator.alloc(u8,total_len);deferallocator.free(concatenated);varpos:usize=0;for(binary_strings.items)|item|{@memcpy(concatenated[pos..pos+item.len],item);pos+=item.len;}// Split into 8-character chunks and convert to bytesvarresult_bytes=ArrayList(u8).init(allocator);deferresult_bytes.deinit();vari:usize=0;while(i+8<=concatenated.len):(i+=8){constchunk=concatenated[i..i+8];constbyte_value=std.fmt.parseInt(u8,chunk,2)catch|err|{print("Error parsing binary: {}\n",.{err});return;};tryresult_bytes.append(byte_value);}// Convert to UTF-8 string and printconstresult_str=result_bytes.items;if(std.unicode.utf8ValidateSlice(result_str)){print("Output: {s}\n",.{result_str});}else{print("Invalid UTF-8 sequence\n",.{});}}
Input: VG8gZXJyIGlzIGh1bWFuLCBidXQgdG8gcmVhbGx5IGZvdWwgdGhpbmdzIHVwIHlvdSBuZWVkIGEgY29tcHV0ZXIuCiAgICAtLVBhdWwgUi5FaHJsaWNoOutput: To err is human, but to really foul things up you need a computer. --Paul R.Ehrlich
Using shared libraries for cURL and message hashing:
var [const] MsgHash=Import("zklMsgHash"), Curl=Import("zklCurl"); icon:=Curl().get("http://rosettacode.org/favicon.ico"); //-->(Data(4,331),693,0)icon=icon[0][icon[1],*]; // remove headericonEncoded:=MsgHash.base64encode(icon);iconDecoded:=MsgHash.base64decode(iconEncoded);File("rosettaCodeIcon.ico","wb").write(iconDecoded); # eyeball checking says goodprintln("Is the Rosetta Code icon the same (byte for byte) encoded then decoded: ", icon==iconDecoded);Is the Rosetta Code icon the same (byte for byte) encoded then decoded: True
msg,b64 := "Rosetta Code Base64 decode data task", MsgHash.base64encode(msg);println("Original: %s\nEncoded: %s\nBytes: %s\nDecoded: %s" .fmt(msg, b64.text, b64.bytes().apply("toString",16).concat(","), MsgHash.base64decode(b64).text));Original: Rosetta Code Base64 decode data taskEncoded: Um9zZXR0YSBDb2RlIEJhc2U2NCBkZWNvZGUgZGF0YSB0YXNrBytes: 55,6d,39,7a,5a,58,52,30,59,53,42,44,62,32,52,6c,49,45,4a,68,63,32,55,32,4e,43,42,6b,5a,57,4e,76,5a,47,55,67,5a,47,46,30,59,53,42,30,59,58,4e,72,aDecoded: Rosetta Code Base64 decode data task