Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将字节值数组转换为base64编码字符串并打断长行,Javascript(代码)_Javascript_Firefox Addon - Fatal编程技术网

将字节值数组转换为base64编码字符串并打断长行,Javascript(代码)

将字节值数组转换为base64编码字符串并打断长行,Javascript(代码),javascript,firefox-addon,Javascript,Firefox Addon,此JavaScript函数获取一个数字数组(范围为0-255),并将其转换为base64编码字符串,然后在必要时打断长行: function encode(data) { var str = ""; for (var i = 0; i < data.length; i++) str += String.fromCharCode(data[i]); return btoa(str).split(/(.{75})/).join("\n").replace(/\n+/g,

此JavaScript函数获取一个数字数组(范围为0-255),并将其转换为base64编码字符串,然后在必要时打断长行:

function encode(data)
{
  var str = "";
  for (var i = 0; i < data.length; i++)
    str += String.fromCharCode(data[i]);

  return btoa(str).split(/(.{75})/).join("\n").replace(/\n+/g, "\n").trim();
}
函数编码(数据)
{
var str=“”;
对于(变量i=0;i

你能用更少的代码做同样的事情吗?你能做到让它跑得更快吗?可移植性无对象,如果您愿意,可以使用全新的语言功能,但必须使用JavaScript。

适用于Firefox 3.6.13:

function encode(data)
{
    var str = data.reduce(function(a,b){ return a+String.fromCharCode(b) },'');
    return btoa(str).replace(/.{76}(?=.)/g,'$&\n');
}

我手边没有Firefox,所以我无法尝试,但从一般的字符串处理角度来看,您似乎还有一些改进的空间。您要做的是,对于每个字节,创建一个比上一个长一个字符的新字符串。这是一个O(N^2)操作。有几种方法可以减少N,从而使算法在近似线性的时间内运行:

  • 构建长度为57的字符串(这将产生76个字符的Base64结果),然后对其执行
    btoa
    ,并将结果字符串添加到输出中

  • 就像#1一样,只需构建一个行数组并在其上调用
    join
    ,即可创建最终的输出字符串

  • 使用
    map
    创建一个单字符字符串数组,然后对其调用
    join

  • 以下是每个方法的一些未经测试的代码:

    function encode(data)
    {
      var output = "";
      var str = "";
      for (var i = 0; i < data.length; i++)
      {
        str += String.fromCharCode(data[i]);
        // the "&& i != data.length - 1" clause
        // keeps the extra \n off the end of the output
        // when the last line is exactly 76 characters
        if (str.length == 57 && i != data.length - 1)
        {
          output += btoa(str) + "\n";
          str = "";
        }
      }
      return output + btoa(str);
    }
    
    function encode(data)
    {
      var output = [];
      var str = "";
      for (var i = 0; i < data.length; i++)
      {
        str += String.fromCharCode(data[i]);
        if (str.length == 57)
        {
          output[output.length] = btoa(str);
          str = "";
        }
      }
      if (str != "")
        output[output.length] = btoa(str);
      return output.join("\n");
    }
    
    function encode(data)
    {
      var str = data.map(function (d) { return String.fromCharCode(d) }).join("");
      return btoa(str).replace(/.{76}(?=.)/g,'$&\n');
    }
    
    我还有一个条目:

    function encode(data)
    {
        var str = String.fromCharCode.apply(null,data);
        return btoa(str).replace(/.{76}(?=.)/g,'$&\n');
    }
    
    缩小,88个字符:

    function e(d){return btoa(String.fromCharCode.apply(d,d)).replace(/.{76}(?=.)/g,'$&\n')}
    
    function e(d){return btoa(String.fromCharCode.apply(d,d)).replace(/.{1,76}/g,'$&\n')}
    
    或者,如果需要尾随换行符,请输入85个字符:

    function e(d){return btoa(String.fromCharCode.apply(d,d)).replace(/.{76}(?=.)/g,'$&\n')}
    
    function e(d){return btoa(String.fromCharCode.apply(d,d)).replace(/.{1,76}/g,'$&\n')}
    

    在什么浏览器中运行得更快<据我所知,code>btoa
    仅受Gecko和WebKit浏览器的支持。事实上,这只是Firefox扩展的一小部分,但如果你有一个聪明的方法使用其他浏览器的JS来实现它,我也很高兴看到。啊@jessegavin:codegolf.SE只是为了娱乐;这是一个实际的、合法的编程问题。您是否需要在其中添加
    trim
    ?@Gabe:我添加它是为了避免返回的字符串有一个尾随换行符,而base64编码的字符串正好是行长度的倍数,否则缺少换行符。但当我在回复你时,我想“Firefox的javascript正则表达式引擎是否支持零宽度正向前瞻?”。的确如此!编辑。哦,这里的对象是最小字符数吗?这可以缩小到116个字符,如果您希望每个输出都有一个尾随换行符(将正则表达式更改为
    /.{1,76}/g
    ),则可以缩小到113个字符。最小字符并不是真正的目标-我将在任何情况下通过自动缩小器运行整个过程-但需要最小的操作。我喜欢使用
    reduce
    ,尽管我认为它并不比for循环快,因为这里的最大成本是增加字符串。需要一个闭包,因为map使用3个参数(数组元素、索引和数组对象)调用其函数和String.fromCharCode可以将多个代码点作为参数来返回多个字符串。巧合的是,就在你发布之前,我记得这一点,并意识到我可以利用这一事实。我喜欢一次分块57个字节以馈送到
    btoa
    。哦,非常好!虽然我不能100%确定
    apply
    的用法。任何函数(无论如何,在Firefox中)都有2**19个参数这样的硬限制,我认为它可能需要做的不仅仅是将数组解压到参数区域。不过,我不希望我的数组有那么长,而且短的很好。我刚刚测试了它(在Firebug中),它在这里工作到大约12*2**20个数字。这甚至不是一个硬性限制,它只是报告脚本堆栈空间配额已用尽。需要多长时间?你能用大字节数组给我们的各种方法计时吗?@Gabe:Hah,刚刚用2**23个条目的数组完成了这项工作。我在Firebug中分别计时了5次,抛出了最低和最高的,并取了剩余3次的平均值。我的第一次大约需要6秒钟。第一次大约需要5.8秒,第二次大约需要5.3秒,第三次大约需要2.7秒,而这一次大约需要0.9秒。很好!我认为
    map
    apply
    将是最好的,这就是为什么我对这个答案投了高票,而不是你的另一个答案。