Page 1 of 1

BASE64 Conversion

Posted: Tue Oct 16, 2018 3:19 am
by MarcusLancaster
Hi all.

Quick question - is there a way to convert to/from BASE64 in client side LR javascript?

Cheers for now.

Marcus.

Re: BASE64 Conversion

Posted: Tue Oct 16, 2018 1:14 pm
by jasonzhou
There are two JavaScript functions btoa() and atob() can do BASE64 encoding/decoding. (https://developer.mozilla.org/en-US/doc ... d_decoding)

For exmaple:
var encodedData = window.btoa('Hello, world'); // encode a string
var decodedData = window.atob(encodedData); // decode the string

Re: BASE64 Conversion

Posted: Tue Oct 16, 2018 10:06 pm
by MarcusLancaster
Hi Jason.

Thanks for this - I'll give it a try.

Cheers.

Marcus.

Re: BASE64 Conversion

Posted: Fri Oct 19, 2018 1:56 pm
by jasonzhou
atob and btoa may not work if there is no JavaScript window context, so the following code would satisfy the requirement.
  • Encode byte array

Code: Select all

function base64EncodeByteArray(byteArray)
{
    const BASE64CODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    var result = "";
    var restBytes = byteArray.length % 3;
    var byteBlocks = byteArray.length / 3;
    var index = 0;
    
    if (byteBlocks >= 1)
    {
        for (var i = 0; i < byteBlocks; i++)
        {        
            var block = (byteArray[index++] << 16) | (byteArray[index++] << 8) | byteArray[index++];
            result += BASE64CODE[(block&0xFC0000)>>18] + BASE64CODE[(block&0x3F000)>>12] + BASE64CODE[(block&0xFC0)>>6] + BASE64CODE[(block&0x3F)];
        }
    }

    //
    var remainingBytes = byteArray.length - index;
    
    switch(remainingBytes)
    {        
        case 1:
            var block = byteArray[index]
            result += BASE64CODE[(block&0xFC)>>2] + BASE64CODE[(block&0x03)<<4] + "==";
            break;
            
        case 2:
            var block = (byteArray[index] << 8) | byteArray[index+1];
            result += BASE64CODE[(block&0xFC00)>>10] + BASE64CODE[(block&0x03F0)>>4] + BASE64CODE[(block&0x0F)<<2] + "=";
            break;
    }
    
    //
    return result;
}
  • Encode binary data read from SQLite database with hex() function

Code: Select all

function hexStrToBase64(hexString)
{
    if (hexString.length % 2 == 0)
    {
        var bufferIndex = 0;
        var buffer = new Uint8Array(hexString.length/2);

        for(var i=0;i<hexString.length;i+=2)
        {
            var c1 = hexString.charAt(i);
            var c2 = hexString.charAt(i+1);
            var i1 = parseInt(c1,16);
            var i2 = parseInt(c2,16);
            var data = i1<<4 | i2;
            buffer[bufferIndex++] = data;
        }
    }
    
    var result = base64EncodeByteArray(buffer);
    return result;
}

Re: BASE64 Conversion

Posted: Mon Oct 22, 2018 6:03 pm
by MarcusLancaster
Excellent - thanks for the follow-up post Jason