Google-App-Script base64 对比 javascript base64 解码

Google-App-Script base64 vs javascript base64 decode

请帮助 GoogleApps Script Base 64 解码

-- Google Apps 脚本

  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 ]

正确转换javascript, 但为什么 Google Apps 脚本会转换为错误的字节?

如何解决这个问题?

看到“Uint8Array”的文档,是这样说的。 Ref

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

由此,你的 _base64ToArrayBuffer returns [17, 119, 179, 0, 0].

另一方面,在 Google Apps 脚本中,字节数组默认使用“twos-complement 8 位有符号整数”。由此,Utilities.base64Decode("EXezAAA=") returns [17, 119, -77, 0, 0].

这就是你目前情况的原因。

例如Javascript中要检索相同的值时,请修改如下

发件人:

var bytes = new Uint8Array(len);

收件人:

var bytes = new Int8Array(len);

由此,你的 _base64ToArrayBuffer returns [17, 119, -77, 0, 0].

当你想在Google Apps Script中获取[17, 119, 179, 0, 0]的值时,请修改如下。

发件人:

var byte_base64 = Utilities.base64Decode(tmp_base64);

收件人:

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

由此,你的 _base64ToArrayBuffer returns [17, 119, 179, 0, 0].

参考文献:

  • Uint8Array

  • Int8Array

    • 看到“Int8Array”的文档,是这样说的。 Ref

    The Int8Array typed array represents an array of twos-complement 8-bit signed integers.