Here are some even faster versions

:
Base64Encode():
Code:
Base64Encode(ByRef Bin,Length = "")
{
static CharSet := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
If (Length = "")
Length := StrLen(Bin) << !!A_IsUnicode
VarSetCapacity(Output,Ceil(Length / 3) * 4), Index := 0, pBin := &Bin
Loop, % Length // 3
Temp1 := (*(pBin ++) << 16) | (*(pBin ++) << 8) | (*(pBin ++)), Output .= SubStr(CharSet,((Temp1 >> 18) & 63) + 1,1) . SubStr(CharSet,((Temp1 >> 12) & 63) + 1,1) . SubStr(CharSet,((Temp1 >> 6) & 63) + 1,1) . SubStr(CharSet,(Temp1 & 63) + 1,1)
Temp2 := Mod(Length,3)
If (Temp2 = 0)
Return, Output
Index := pBin - &Bin, Temp1 := NumGet(Bin,Index,"UChar") << 16
If (Temp2 = 1)
Return, Output . SubStr(CharSet,((Temp1 >> 18) & 63) + 1,1) . SubStr(CharSet,((Temp1 >> 12) & 63) + 1,1) . "=="
Temp1 |= NumGet(Bin,Index + 1,"UChar") << 8
Return, Output . SubStr(CharSet,((Temp1 >> 18) & 63) + 1,1) . SubStr(CharSet,((Temp1 >> 12) & 63) + 1,1) . SubStr(CharSet,((Temp1 >> 6) & 63) + 1,1) . "="
}
Benchmark:Code:
Benchmark: Base64 encoding with 1000 character strings
Iterations: 1000
Control Run: 0.818053 ms. (0.000818 ms. per run)
Original Encoder (rseding91): 4233.641312 ms. (4.233641 ms. per run)
Optimised Encoder (Uberi): 1833.870210 ms. (1.833870 ms. per run)
Base64Decode:Code:
Base64Decode(ByRef Bin,Code,IsString = 0)
{
static CharSet := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
StringReplace Code, Code, =,, All
Length := StrLen(Code), VarSetCapacity(Bin,Ceil((Length / 4) * 3),0), Index := 1, BinPos := 0
Loop, % Length // 4
Temp1 := ((InStr(CharSet,SubStr(Code,Index,1),True) - 1) << 18) | ((InStr(CharSet,SubStr(Code,Index + 1,1),True) - 1) << 12) | ((InStr(CharSet,SubStr(Code,Index + 2,1),True) - 1) << 6) | (InStr(CharSet,SubStr(Code,Index + 3,1),True) - 1), NumPut((Temp1 >> 16) | (((Temp1 >> 8) & 255) << 8) | ((Temp1 & 255) << 16),Bin,BinPos,"UInt"), Index += 4, BinPos += 3
If (Length & 3)
{
Temp1 := ((InStr(CharSet,SubStr(Code,Index,1),True) - 1) << 18) | ((InStr(CharSet,SubStr(Code,Index + 1,1),True) - 1) << 12), NumPut(Temp1 >> 16,Bin,BinPos,"UChar")
If (Length & 1)
Temp1 |= ((InStr(CharSet,SubStr(Code,Index + 2,1),True) - 1) << 6), NumPut((Temp1 >> 8) & 255,Bin,BinPos + 1,"UChar")
}
If IsString
VarSetCapacity(Bin,-1)
}
Benchmark:Code:
Benchmark: Base64 decoding with 1000 character strings
Iterations: 1000
Control Run: 0.615920 ms. (0.000616 ms. per run)
Original Decoder (rseding91): 4210.171410 ms. (4.210171 ms. per run)
Optimised Decoder (Uberi): 3145.511597 ms. (3.145512 ms. per run)
Code isn't as short, though, but it is much faster at huge inputs, such as files.
Edit: Encoding function is even faster (benchmarks and code updated)