Today I was looking for a method for encoding and decoding in Base64.
There are many libraries including the well-known StringUtils. But the decoding signaled me an error but it was not possible to understand exactly what the error was
So I created for B4J a class that using inline Java code decoded the string, but getting the same error. In any case it would not work for B4i
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
So I searched around a bit until I found this site and translated the code in B4X (hoping there are no errors). Want to share it, maybe it can be useful to someone else
Decode
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Encode
	
	
	
	
	
	
	
		
			
			
			
			
			
		
	
	
	
		
	
	
		
	
Although it is slower than existing libraries, it is possible to compress and decompress with B4X code and therefore not linked to a specific platform and modifiable to adapt them to the many existing variants.
Especially if there is an error in the data to be decoded it is possible to do a more specific debugging
			
			There are many libraries including the well-known StringUtils. But the decoding signaled me an error but it was not possible to understand exactly what the error was
So I created for B4J a class that using inline Java code decoded the string, but getting the same error. In any case it would not work for B4i
			
				B4X:
			
		
		
		#if java
import java.util.Base64;
public byte[] decode(byte[] original) {
     byte[] decoded = Base64.getDecoder().decode(original);
     return decoded;
}
#END ifSo I searched around a bit until I found this site and translated the code in B4X (hoping there are no errors). Want to share it, maybe it can be useful to someone else
Decode
			
				B4X:
			
		
		
		Public Sub Base64Decode(S As String) As String
    Dim base64chars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    Dim P,R = "" As String
    #IF B4J or B4A
    Dim Ob As JavaObject = S 'ignore
    S=Ob.RunMethod("replaceAll",Array As Object("[^ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=]",""))
    #ELSE
    ' Don't known - Working Progress
    #End If
    If S.CharAt(S.Length-1)="=" Then
        If S.CharAt(S.Length-2)="=" Then
            p="AA"
        Else
            P="A"
        End If
    Else
        P=""
    End If
    S=S.SubString2(0,S.Length-P.Length) & P
    For C = 0 To S.Length-1 Step 4
        Try
            Dim n As Int = Bit.ShiftLeft(base64chars.IndexOf(S.CharAt(C)),18) + Bit.ShiftLeft(base64chars.IndexOf(S.CharAt(C+1)),12) + Bit.ShiftLeft(base64chars.IndexOf(S.CharAt(C+2)),6)+ base64chars.IndexOf(S.CharAt(C+3))
            r = r & Chr(Bit.And(Bit.ShiftRight(n,16),0xFF)) & Chr(Bit.And(Bit.ShiftRight(n,8),0xFF)) & Chr(Bit.And(n,0xFF))
        Catch
            Log("Position: " & C)
        End Try
    Next
    Return R.SubString2(0, R.Length - P.Length)
End SubEncode
			
				B4X:
			
		
		
		Public Sub Base64Encode(S As String) As String
    Dim c As Int = S.Length Mod 3
    Dim base64chars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    Dim P = "",R = "" As String
    ' add a right zero pad To make this string a multiple of 3 characters
    If c>0 Then
        Do While c<3
            P = P & "="
            S = S & "0"
            c=c+1
        Loop
    End If
    For c = 0 To S.Length-1 Step 3
        If (c > 0 And (c / 3 * 4) Mod 76 = 0) Then R=R & Chr(10) & Chr(13)
        Dim n As Int = Bit.ShiftLeft(Asc(S.CharAt(c)),16) + Bit.ShiftLeft(Asc(S.CharAt(c+1)),8) + Asc(S.CharAt(c+2))
        Dim n1 As Int = Bit.And(Bit.ShiftRight(n,18),63)
        Dim n2 As Int = Bit.And(Bit.ShiftRight(n,12),63)
        Dim n3 As Int = Bit.And(Bit.ShiftRight(n,6),63)
        Dim n4 As Int = Bit.And(n,63)
        R = R & base64chars.CharAt(n1) & base64chars.CharAt(n2) & base64chars.CharAt(n3) & base64chars.CharAt(n4)
    Next
    Return r.substring2(0, r.length - p.length) & p
End SubAlthough it is slower than existing libraries, it is possible to compress and decompress with B4X code and therefore not linked to a specific platform and modifiable to adapt them to the many existing variants.
Especially if there is an error in the data to be decoded it is possible to do a more specific debugging
			
				Last edited: 
			
		
	
							 
				 
 
		 
 
		 
 
		 
 
		