如何将数组(数字)加载到谷歌应用程序脚本字节[]

时间:2013-12-17 09:41:30

标签: javascript google-apps-script

我在Google Apps脚本中有一个数组(数字),我想将其转换为base64。我当然可以使用一个简单的开源库,例如this one

但是GAS已经使用Utilities.base64Encode(Byte[])为此提供了相应的功能 但要调用此函数,我需要Byte[]而不是Number[]

因此,以下脚本会出错:(Cannot convert Array to (class)[].

function testBase64Encode()
{
  var bytes = [];
  for (var i = 0; i < 255; i++) bytes.push(i);

  var x = Utilities.base64Encode(bytes)
} 

通常Byte[]直接来自Blob的GetBytes()函数,但在我的情况下,数组(数字)来自zlib encryption lib

所以我试图找到一种方法将该数字数组转换为Byte[],可以与Utilities.base64Encode(Byte[])一起使用。

我确实尝试自己创建一个Byte并将它们放入一个数组中,但是下面的代码也会出错:(ReferenceError: "Byte" is not defined.

var b1 = new Byte();

我做了一些测试,只要字节数值中的值为128或更低,它似乎就可以工作。我发现这很奇怪,因为一个字节应该达到255。

以下代码对'bytes'运行正常但对'bytes2'运行失败,因为有一个大于128的值:

function testByteArrays()
{
  var bytes = [];
  for (var i = 0; i < 128; i++) bytes.push(i);
  var x = Utilities.newBlob(bytes)

  var bytes2 = [];
  for (var i = 0; i < 129; i++) bytes2.push(i);
  var x = Utilities.newBlob(bytes2)
}

1 个答案:

答案 0 :(得分:3)

  

......一个字节应该达到255。

但不是Two's complement符号......在这种情况下,字节应该在[-128..127]范围内,其中高位保留为符号位。给定正整数i,如果它大于127,我们需要计算二进制补码。可以通过减去2 8 (256)来完成。将其应用于您的第一个示例:

function testBase64Encode()
{
  var bytes = [];
  for (var i = 0; i < 255; i++) bytes.push(i<128?i:i-256);

  var x = Utilities.base64Encode(bytes)
} 

这将避免您收到的错误消息(Cannot convert Array to (class)[].)。理想情况下,您还应确保数值从0..255开始。