Base64 encode decode memory and strings
Posted: Fri Feb 05, 2016 9:26 am
Here are a few routines to help encode decode to/from base64...
Code: Select all
Global base64$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
Procedure.l Base64Decoder(*in,insize,*out,outsize)
actual=0
If insize%4=0
For loop=0 To insize Step 4
c0=(FindString(base64$,PeekS(*in,loop,1,#PB_Ascii))-1)&$3f
c1=(FindString(base64$,PeekS(*in,loop+1,1,#PB_Ascii))-1)&$3f
PokeB(*out,actual,((c0<<2)|(c1>>4))&$ff)
actual+1
If actual>=outsize
Break
EndIf
c2=(FindString(base64$,PeekS(*in,loop+2,1,#PB_Ascii))-1)&$3f
PokeB(*out,actual,((c1<<4)|(c2>>2))&$ff)
actual+1
If actual>=outsize
Break
EndIf
c3=(FindString(base64$,PeekS(*in,loop+3,1,#PB_Ascii))-1)&$3f
PokeB(*out,actual,((c2<<6)|c3)&$ff)
actual+1
If actual>=outsize
Break
EndIf
Next
EndIf
ProcedureReturn actual
EndProcedure
Procedure$ Base64Encoder(*in,insize)
index=0
out$=""
While index<insize
b0=PeekB(*in,index)&$ff
b1=PeekB(*in,index+1)&$ff
b2=PeekB(*in,index+2)&$ff
index+3
out$+Mid(base64$,((b0>>2)&$3f)+1,1)
out$+Mid(base64$,(((b0<<4)|(b1>>4))&$3f)+1,1)
out$+Mid(base64$,(((b1<<2)|(b2>>6))&$3f)+1,1)
out$+Mid(base64$,(b2&$3f)+1,1)
Wend
outsize=((Len(out$)+3)/4)*4
out$=LSet(out$,outsize,"=")
ProcedureReturn out$
EndProcedure
Procedure.l Base64Decode(string$,*out,outsize)
If string$<>""
insize=((Len(string$)+3)/4)*4
string$=LSet(string$,insize,"=")
*input=AllocateMemory(insize+10)
If *input
PokeS(*input,0,string$,insize,#PB_Ascii)
actual=Base64Decoder(*input,insize,*out,outsize)
FreeMemory(*input)
EndIf
EndIf
ProcedureReturn actual
EndProcedure
Procedure$ Base64DecodeString(string$)
string$=Trim(string$)
If string$<>""
outsize=(Len(string$)*1.5)+64
*out=AllocateMemory(outsize)
If *out
actual=Base64Decode(string$,*out,outsize)
If actual
result$=PeekS(*out,0,actual,#PB_UTF8)
EndIf
FreeMemory(*out)
EndIf
EndIf
ProcedureReturn result$
EndProcedure
Procedure$ Base64EncodeString(string$)
If string$<>""
size=Len(string$)*2
*mem=AllocateMemory(size)
If *mem
size=PokeS(*mem,0,string$,-1,#PB_UTF8)
result$=Base64Encoder(*mem,size)
FreeMemory(*mem)
EndIf
EndIf
ProcedureReturn result$
EndProcedure
a$=Base64EncodeString("This is a test")
Debug("encoded="+a$)
Debug("decoded="+Base64DecodeString(a$))