Voilà:
Code: Select all
CompilerIf #PB_Compiler_IsMainFile
EnableExplicit
CompilerEndIf
Procedure.s _Base64Encoder(*InputBuffer, InputBufferLength.i, Flags.i=0)
Protected Result$, OutputBufferLength.i, *OutputBuffer, ResultLength.i
OutputBufferLength = InputBufferLength * 1.35
If OutputBufferLength < 64
OutputBufferLength = 64
EndIf
*OutputBuffer = AllocateMemory(OutputBufferLength)
If *OutputBuffer
ResultLength = Base64Encoder(*InputBuffer, InputBufferLength, *OutputBuffer, OutputBufferLength, Flags)
If ResultLength > 0
Result$ = PeekS(*OutputBuffer, ResultLength, #PB_Ascii)
EndIf
FreeMemory(*OutputBuffer)
EndIf
ProcedureReturn Result$
EndProcedure
Procedure.i _Base64Decoder(Input$, *OutputBuffer, OutputBufferLength)
Protected *InputBuffer, Length.i
*InputBuffer = AllocateMemory(StringByteLength(Input$, #PB_Ascii))
If *InputBuffer
PokeS(*InputBuffer, Input$, -1, #PB_Ascii|#PB_String_NoZero)
Length = Base64Decoder(*InputBuffer, MemorySize(*InputBuffer), *OutputBuffer, OutputBufferLength)
FreeMemory(*InputBuffer)
EndIf
ProcedureReturn Length
EndProcedure
CompilerIf #PB_Compiler_IsMainFile
Define Test$, Base64$, *OutBuffer, Length.i, OutLength.i
Test$ = "Hallo"
Base64$ = _Base64Encoder(@Test$, StringByteLength(Test$))
Debug Base64$
OutLength = StringByteLength(Base64$, #PB_Ascii) * 0.7
If OutLength < 64
OutLength = 64
EndIf
*OutBuffer = AllocateMemory(OutLength)
If *OutBuffer
Length = _Base64Decoder(Base64$, *OutBuffer, MemorySize(*OutBuffer))
If Length > 0
ShowMemoryViewer(*OutBuffer, Length)
EndIf
FreeMemory(*OutBuffer)
EndIf
CompilerEndIf
But as you can see in the example: it is still tricky.
Bernd