Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.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
使用javascript解码平铺base64数据时遇到问题_Javascript_Jquery_Base64_Decode - Fatal编程技术网

使用javascript解码平铺base64数据时遇到问题

使用javascript解码平铺base64数据时遇到问题,javascript,jquery,base64,decode,Javascript,Jquery,Base64,Decode,我正在使用创建平铺贴图。 (平铺是一种平铺贴图编辑器,支持正交贴图和等轴测贴图) 它将地图保存在XML文件中。它可以使用某些编码结构: 常规基线64 base64+gzip base64+zlib 常规csv 现在,我已经完全放弃了gzip(我的服务器gzip的流量,所以没有损失) 所以我想我应该尝试常规的base64解码,使用 但数据却乱七八糟,如下所示: �������������������������������������������������������� 我猜这是二进制编码

我正在使用创建平铺贴图。 (平铺是一种平铺贴图编辑器,支持正交贴图和等轴测贴图)

它将地图保存在XML文件中。它可以使用某些编码结构:

  • 常规基线64
  • base64+gzip
  • base64+zlib
  • 常规csv
现在,我已经完全放弃了gzip(我的服务器gzip的流量,所以没有损失) 所以我想我应该尝试常规的base64解码,使用

但数据却乱七八糟,如下所示:

��������������������������������������������������������
我猜这是二进制编码,但我该怎么处理呢

需要解码的示例数据(常规base64):

需要解码的示例数据(gzip base64):

作为csv的示例数据:

141,142,143,144,145,146,147,
161,162,163,164,165,166,167
那么,我如何将常规的base64编码位转换为csv呢

编辑:

使用Pointy发现的解,我得到了一个半正确的数组。 但是,在几千个字符之后,这两个数字又会出错。在那之后更频繁

然后我发现有人在他的方案中也使用了tiled和base64编码。 在解码阵列后,他还对其进行了以下操作:

        var d = base64_decode($(this).find('data').text());
    var e = new Array();
    for (var i = 0; i <= d.length; i += 4) {
    var f = d[i] | d[i + 1] << 8 | d[i + 2] << 16 | d[i + 3] << 24;
    e.push(f)
    }
var d=base64_decode($(this).find('data').text());
var e=新数组();

对于(var i=0;i尝试逐个字符查看返回的字符串。换句话说,获取数组中每个字符的“charCodeAt”

function codesFromString(str) {
  var rv = [];
  for (var i = 0; i < str.length; ++i)
    rv.push(str.charCodeAt(i));
  }
  return rv;
}
编辑-确定这是一个base64数字解码器:

  var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split("");
  var base64inv = {}; 
  for (var i = 0; i < base64chars.length; i++) { 
    base64inv[base64chars[i]] = i; 
  }
  function decodeNumeric(s) {
    s = s.replace(new RegExp('[^'+base64chars.join("")+'=]', 'g'), "");

    var p = (s.charAt(s.length-1) == '=' ? 
            (s.charAt(s.length-2) == '=' ? 'AA' : 'A') : ""); 
    var r = []; 
    s = s.substr(0, s.length - p.length) + p;

    for (var c = 0; c < s.length; c += 4) {
      var n = (base64inv[s.charAt(c)] << 18) + (base64inv[s.charAt(c+1)] << 12) +
              (base64inv[s.charAt(c+2)] << 6) + base64inv[s.charAt(c+3)];

      r.push((n >>> 16) & 255);
      r.push((n >>> 8) & 255);
      r.push(n & 255);
    }
    return r;
  }
var base64chars='abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz012456789+/'。拆分(“”);
var base64inv={};
对于(var i=0;i>>8)和255);
r、 推送(n&255);
}
返回r;
}
这对您的示例有效,但它表明您编写的结果实际上并不正确。不是“141142143,…”,而是“141,0,0,0142,0,0,0143,0,0,0,0”等。这就是编码字符串中“AAA”的运行


(代码被盗)

我知道这是个老话题,但你最后一个问题的答案是:。

这很有效。不过,数组中只有四分之一的数字是正确的。我可以重复一遍,没问题。然而,经过一定数量的数字之后,他们又错了。比如:41,42,43,44,44,41,44,41409612288应该是:41,42,43,44,44,41,44,4122526227这是怎么发生的?嗯,可能是因为base-64数据正在被解码,但是字符串值的Unicode特性正在妨碍你。由于您确实希望将字节视为原始数值,因此最好使用自定义解码器。就在几天前,我正在玩一个Javascript base-64解码器。我会找的。好的,谢谢!所以,澄清一下:前522个数字是正确的。差不多了!时间似乎要正确得多,但不需要的部分仍然会悄悄地出现。第一次发生这种情况是在623个字符之后(没有不需要的0),这是它应该的方式:14,11255256257,11,12,13,14,14,14,这是它的结果:14,11255,0,1,11,12,13,14,14,所以对于一个小的解码来说,它工作得很好,但当事情变得更大时,它会给出奇怪的结果,我不确定这怎么行得通。
function codesFromString(str) {
  var rv = [];
  for (var i = 0; i < str.length; ++i)
    rv.push(str.charCodeAt(i));
  }
  return rv;
}
var csv = codeFromString(decoded).join(',');
  var base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split("");
  var base64inv = {}; 
  for (var i = 0; i < base64chars.length; i++) { 
    base64inv[base64chars[i]] = i; 
  }
  function decodeNumeric(s) {
    s = s.replace(new RegExp('[^'+base64chars.join("")+'=]', 'g'), "");

    var p = (s.charAt(s.length-1) == '=' ? 
            (s.charAt(s.length-2) == '=' ? 'AA' : 'A') : ""); 
    var r = []; 
    s = s.substr(0, s.length - p.length) + p;

    for (var c = 0; c < s.length; c += 4) {
      var n = (base64inv[s.charAt(c)] << 18) + (base64inv[s.charAt(c+1)] << 12) +
              (base64inv[s.charAt(c+2)] << 6) + base64inv[s.charAt(c+3)];

      r.push((n >>> 16) & 255);
      r.push((n >>> 8) & 255);
      r.push(n & 255);
    }
    return r;
  }