Javascript 如何格式化用于数据传输的压缩字符串

Javascript 如何格式化用于数据传输的压缩字符串,javascript,encode,Javascript,Encode,我正在制作一个移动应用程序(不在浏览器中-因此没有传输层解决方案),它需要将压缩数据发送回服务器。我在javascript中发现了几个可以很好地压缩文本的库,但它们似乎都输出了一个数组 使用LZMA "Lorem ipsum sit amet decorum rex quandum et futurus..." 变成 [93, 0, 0, 1, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 38, 27, -54, 70, 103, 90, -14, 119, -72, 125

我正在制作一个移动应用程序(不在浏览器中-因此没有传输层解决方案),它需要将压缩数据发送回服务器。我在javascript中发现了几个可以很好地压缩文本的库,但它们似乎都输出了一个数组

使用LZMA

"Lorem ipsum sit amet decorum rex quandum et futurus..."
变成

[93, 0, 0, 1, 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, 38, 27, -54, 70, 103, 90, -14, 119, -72, 125, -122, -40, 66, 28, -27, -90, 80, 22, 44, 97, -102, -55, 19, 62, 83, -53, -64, 78, -1, 99, 100, 124, 91, -47, 58, -66, -12, -40, -18, 109, 98, 108, -31, -77, -110, 59, -33, 14, -60, -4, -20, 108, -1, -1, 18, -57, 0, 0]
这很好,但现在我需要将其编码为适合作为HTTP请求的一部分发送的格式


如果可能的话,我希望它以某种方式成为base64字符串,因为它在另一端很容易解码,并且似乎适合于此任务-但我不知道如何将整数字符串转换为base64字符串。

这将获取一个数组并返回base64编码的字符串:

function(input)
    {
        var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        while (i < input.length)
        {
            chr1 = input[i++];
            chr2 = input[i++];
            chr3 = input[i++];

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2))
                enc3 = enc4 = 64;
            else if (isNaN(chr3))
                enc4 = 64;

            output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
        }

        return output;
    }
功能(输入)
{
var keyStr=“abcdefghijklmnopqrstuvxyzabefghijklmnopqrstuvxyz012456789+/=”;
var输出=”;
变量chr1,chr2,chr3,enc1,enc2,enc3,enc4;
var i=0;
while(i>2;
enc2=((chr1&3)>4);
enc3=((chr2&15)>6);
enc4=chr3&63;
if(isNaN(chr2))
enc3=enc4=64;
否则如果(isNaN(chr3))
enc4=64;
输出=输出+按键字符(enc1)+按键字符(enc2)+按键字符(enc3)+按键字符(enc4);
}
返回输出;
}
在现代浏览器上:

var s = myArray.map(function(n) {
    return String.fromCharCode(n & 0xff);  // to fix your negative values
}).join('');

var base64 = btoa(s);

其中,
btoa
是一个全局函数,如果不存在,则可以使用。

如果数组中的数字是小于256的正整数,则该函数似乎有效。是吗?@billymon是的,但是如果你只打算支持现代浏览器,你可以使用下面Alnitak的答案。正如问题开头所说,我根本没有使用任何浏览器,这就是为什么我不能使用@Alnitak的答案。@billymon哈!是的,很抱歉我读了这一点,但很快就忘了。谢谢你的建议-不幸的是我没有浏览器,所以这对我来说不起作用。@Billymon在这种情况下,只需找到一个现成的
btoa
实现,例如。-注意:该版本似乎非常适合node.js,如果这是您的环境的话