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 ?
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.
var bytes = new Uint8Array(len);
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.
var byte_base64 = Utilities.base64Decode(tmp_base64);
var byte_base64 = [...Uint8Array.from(Utilities.base64Decode(tmp_base64))];
By this, your _base64ToArrayBuffer
returns [17, 119, 179, 0, 0]
.
The Int8Array typed array represents an array of twos-complement 8-bit signed integers.