我在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)
}
答案 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开始。