javascriptgoogle-apps-script

Google-App-Script base64 vs javascript base64 decode


Please, help with GoogleApps Script Base 64 Decode

-- Google Apps Script

  var tmp_base64 = "EXezAAA=";
  var byte_base64 = Utilities.base64Decode(tmp_base64);

  return ContentService.createTextOutput('\''+ tmp_base64 + '\' => \''+byte_base64 +'\'' );

return : 'EXezAAA=' => '17,119,-77,0,0'

-- javascript

function _base64ToArrayBuffer(base64) {
    var binary_string = window.atob(base64);
    var len = binary_string.length;
    var bytes = new Uint8Array(len);
    for (var i = 0; i < len; i++) {
        bytes[i] = binary_string.charCodeAt(i);
    }
    return bytes;
}
_base64ToArrayBuffer('EXezAAA=');

return : Uint8Array(5) [ 17, 119, 179, 0, 0 ]

correctly converted javascript, but why does Google Apps Script convert to wrong bytes?

How to solve this problem ?


Solution

  • When the document of "Uint8Array" is seen, it says as follows. Ref

    The Uint8Array typed array represents an array of 8-bit unsigned integers.

    By this, your _base64ToArrayBuffer returns [17, 119, 179, 0, 0].

    On the other hand, at Google Apps Script, the byte array uses "twos-complement 8-bit signed integers" as the default. By this, Utilities.base64Decode("EXezAAA=") returns [17, 119, -77, 0, 0].

    This is the reason for your current situation.

    For example, when you want to retrieve the same value, in Javascript, please modify it as follows.

    From:

    var bytes = new Uint8Array(len);
    

    To:

    var bytes = new Int8Array(len);
    

    By this, your _base64ToArrayBuffer returns [17, 119, -77, 0, 0].

    When you want to retrieve the value of [17, 119, 179, 0, 0] at Google Apps Script, please modify it as follows.

    From:

    var byte_base64 = Utilities.base64Decode(tmp_base64);
    

    To:

    var byte_base64 = [...Uint8Array.from(Utilities.base64Decode(tmp_base64))];
    

    By this, your _base64ToArrayBuffer returns [17, 119, 179, 0, 0].

    References: