Code: Alles auswählen
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
;Schaue mal ab hier...
Procedure CreateCallback(Status, Filename$, File, SizeRead)
Select Status
Case #PB_Status_Error
; File saving has failed
EndSelect
EndProcedure
Procedure ReadCallback(Status, Filename$, File, Size)
If Status = #PB_Status_Loaded
Debug "File: " + Filename$ + " - Size: " + Size + " bytes"
*Buffer = ExportFileMemory(0)
CloseFile(0)
SetGadgetText(1, Base64Encoder(*Buffer, Size)) ;Das ist dein Bild als Base64 - String
FileEnde.s = StringField(Filename$, 2, ".")
Debug "Bild."+FileEnde
If CreateFile(1, "Bild."+FileEnde, @CreateCallback(), #PB_LocalStorage)
*Bildspeicher = AllocateMemory(Size)
Base64Decode(GetGadgetText(1), *Bildspeicher, Size)
For i = 0 To Size
WriteByte(1, PeekB(*Bildspeicher,i))
Next i
If Not OpenFile(2, "Bild."+FileEnde, @CreateCallback(), #PB_LocalFile)
ExportFile(1, "image/"+FileEnde, #PB_LocalFile)
EndIf
CloseFile(1)
EndIf
ElseIf Status = #PB_Status_Error
Debug "Error when loading the file: " + Filename$
EndIf
EndProcedure
Procedure RequesterSuccess()
; Process all the selected filename
;
While NextSelectedFile()
Debug "Filename: " + SelectedFileName()
OpenFile(0, SelectedFileName(), @ReadCallback(), #PB_LocalFile)
Wend
EndProcedure
Procedure ButtonEvent()
OpenFileRequester("", @RequesterSuccess(), #PB_Requester_MultiSelection)
EndProcedure
If OpenWindow(0, 100, 100, 200, 240, "File")
ButtonGadget(0, 10, 10, 180, 25, "Open local file...")
EditorGadget(1, 10, 40, 180, 190, #PB_Editor_WordWrap)
BindGadgetEvent(0, @ButtonEvent())
EndIf