【问题标题】:How to format compressed string for data transfer如何格式化压缩字符串以进行数据传输
【发布时间】:2013-02-04 11:17:54
【问题描述】:

我正在制作一个移动应用程序(不在浏览器中 - 所以没有传输层解决方案),它需要将压缩数据发送回服务器。我在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字符串。

【问题讨论】:

    标签: javascript encode


    【解决方案1】:

    这需要一个数组并返回一个 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;
        }
    

    【讨论】:

    • 如果数组中的数字是小于 256 的正整数,这似乎有效。正确吗?
    • @BillyMoon 是的,但如果你只打算支持现代浏览器,你可以使用下面 Alnitak 的答案。
    • 我根本没有使用任何浏览器,正如问题开头所述,这就是为什么我不能使用@Alnitak 的答案。
    • @BillyMoon Ha!是的,很抱歉我读过那段内容,但很快就忘记了。
    【解决方案2】:

    在现代浏览器上:

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

    其中btoa 是一个全局函数,如果不存在,它可以是shimmed

    【讨论】:

    • 感谢您的建议 - 不幸的是我没有浏览器,所以这对我不起作用。
    • @BillyMoon 在这种情况下,只需找到现成的 btoa 实现,例如github.com/davidchambers/Base64.js - 注意:该版本似乎非常适合 node.js,如果那是您的环境
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2011-12-18
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多