B4J Code Snippet [XUI] SD Base64 - Encode / Decode

Discussion in 'B4J Code Snippets' started by Star-Dust, May 12, 2019.

  1. Star-Dust

    Star-Dust Expert Licensed User

    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
    Code:
    #if java
    import java.util.Base64;

     public byte[] decode(byte[] original) {
         byte[] decoded = Base64.getDecoder().decode(original);
         return decoded;
     }
    #END if
    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 :D

    Decode
    Code:
    Public Sub Base64Decode(S As StringAs 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 Sub
    Encode
    Code:
    Public Sub Base64Encode(S As StringAs 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 * 4Mod 76 = 0Then 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 Sub
    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
     
    Last edited: May 13, 2019
Loading...
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice