js 64进制转换方法 & URL参数压缩

经常URL上面需要有不少中文,但直接放置中文容易出现乱码,所以要进行转码,但普通转码后,会发现URL太长了,不便于保存和处理。和朋友讨论以后,觉得可以使用一定的压缩算法,将转码后的中文进行处理,能够明显减少URL的长度,一般能减少50%
 
代码如下:

   //普通2、8、10、16进制自由转换
   function EvalAny(num00, fromRadix, toRadix)
    {
       var num01 = parseInt(num00, fromRadix)
       return num01.toString(toRadix);
    }
    //将某个64以下的数字由10进制转为64进制
   function n10To64(num) {
       if (num < 10) {
           return String.fromCharCode(48 + num);
       } else if (num >= 10 && num <= 35) {
           return String.fromCharCode(55 + num);
       } else if (num >= 36 && num <= 61) {
           return String.fromCharCode(61 + num);
       } else if (num == 62) {
           return "-";
       } else if (num == 63) {
           return "_";
       }
       return "";
    }
    //将某个64以下的数字由64进制转为10进制
   function n64To10(num){
       var j = num.charCodeAt();
       if (num == "_") {
           return 63;
       } else if (num == "-") {
           return 62;
       } else if (j >= 97 && j <= 122) {
           return j - 61;
       } else if (j >= 65 && j <= 90) {
           return j - 55;
       } else if (j >= 48 && j <= 57) {
           return j - 48;
       }
       return "";
    }
    //将16进制数字转换为64进制
   function w16To64(num) {
       var a2 = EvalAny(num, 16, 2);
       while (a2.length < 16) {
           a2 = "0" + a2;
       }
       var b1 = parseInt(EvalAny(a2.substring(0, 4), 2, 10));
       var b2 = parseInt(EvalAny(a2.substring(4, 10), 2, 10));
       var b3 = parseInt(EvalAny(a2.substring(10, 16), 2, 10));
       return n10To64(b1) + n10To64(b2) + n10To64(b3)
    }
    //将64进制数字转换为16进制
   function w64To16(num) {
       var a = 0;
       for (var n = 0; n < num.length; n++) {
           var x = n64To10(num.charAt(n));
           for (var m = 0; m < (num.length - n - 1); m++) {
               x = x * 64;
           }
           a += x;
       }
       var a1 = EvalAny(a, 10, 16);
       while (a1.length < 4) {
           a1 = "0" + a1;
       }
       return a1;
    }
    //汉字、特殊字符等转Unicode编码
   function toUnicode(text)
    {
       text = escape(text.toString()).replace(/\+/g, "%2B");

       var matches = text.match(/(%([0-9A-F]{2}))/gi);
       if (matches)
       {
           for (var matchid = 0; matchid < matches.length; matchid++)
           {
               var code = matches[matchid].substring(1, 3);
               text = text.replace(matches[matchid], '%u00' + code);
           }
       }
       return text;
    }
    //将汉字转Unicode码、16进制转64进制、并实现压缩(主函数)
   function toZipUnicode(text)
    {
       text = toUnicode(text);
       var tmp = "";
       for (var i = 0; i < text.length; i++) {
           if (text.charAt(i) == "%" && text.charAt(i + 1) == "u"){
               tmp += w16To64(text.substring(i + 2, i + 6));
               i += 5
           } else {
               tmp += ("$" + text.charAt(i));
           }
       }
       return tmp;
    }
    //将压缩的参数还原汉字(主函数)
   function unZipUnicode(text)
    {
       var tmp = "";
       for (var i = 0; i < text.length; i++) {
           if (text.charAt(i) == "$") {
               tmp += text.substring(i+1, i+2);
               i++
           } else {
               tmp += "\\u" + w64To16(text.substring(i, i+3));
               i+=2;
           }
       }
       var unTmp = "";
       eval_r("unTmp=\""+tmp+"\"");
       return unTmp;
   }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要将JavaScript中的XML内容转换为流文件并压缩,您可以按照以下步骤行操作: 1. 首先,您需要将XML内容转换为字符串。您可以使用JavaScript中的`XMLSerializer`对象中的`serializeToString()`方法将XML对象转换为字符串。 2. 接下来,您需要使用JavaScript中的`Blob`对象将字符串转化为二数据流。使用`Blob`对象的构造函数,传入一个数组,其中包含您的XML字符串,然后指定MIME类型为`application/xml`。 3. 然后,您可以使用`JSZip`库来创建一个压缩包。通过使用`JSZip`库的构造函数,您可以创建一个新的Zip实例。 4. 将刚刚创建的`Blob`对象添加到压缩包中,使用`JSZip`库的`file()`方法。您需要指定一个文件名,并将上一步中创建的`Blob`对象作为参数传入。 5. 最后,使用`JSZip`库的`generateAsync()`方法生成压缩包,并将其保存为一个流文件。传入参数 `{type: &quot;blob&quot;}` 可以确保生成的数据是二流。 以下是示例代码实现上述步骤: ```javascript // 转换XML内容为字符串 const xmlString = new XMLSerializer().serializeToString(xmlObject); // 创建Blob对象 const blob = new Blob([xmlString], {type: &quot;application/xml&quot;}); // 创建JSZip实例 const zip = new JSZip(); // 将Blob对象添加到压缩包中 zip.file(&quot;xmlFile.xml&quot;, blob); // 生成压缩包并保存为流文件 zip.generateAsync({type:&quot;blob&quot;}) .then(function(content) { // 将压缩包保存为流文件 saveAs(content, &quot;compressed.zip&quot;); }); ``` 希望这些步骤对您有所帮助! ### 回答2: 在JavaScript中,你可以使用XMLHttpRequest对象将XML内容转换为文件流,并压缩操作。以下是一个简单的示例代码: ```javascript // 创建XMLHttpRequest对象 var xhr = new XMLHttpRequest(); // 定义要转换为文件流的XML内容 var xmlContent = &quot;&lt;root&gt;&lt;name&gt;John&lt;/name&gt;&lt;age&gt;30&lt;/age&gt;&lt;/root&gt;&quot;; // 将XML内容转换为Blob对象 var blob = new Blob([xmlContent], {type: &#39;text/xml&#39;}); // 创建压缩文件流 var compressedStream = new CompressedStream(blob); // 压缩文件完成后的回调函数 compressedStream.oncompress = function(compressedBlob) { // 创建下载链接 var downloadLink = document.createElement(&#39;a&#39;); downloadLink.href = URL.createObjectURL(compressedBlob); downloadLink.download = &#39;compressed.xml&#39;; // 触发下载 downloadLink.click(); }; // 压缩文件流 compressedStream.compress(); ``` 上述代码中,我们首先创建了一个XMLHttpRequest对象,然后定义了要转换为文件流的XML内容,通过创建Blob对象将XML内容转换为文件流。接下来,我们使用了一个自定义的CompressedStream对象来行文件流的压缩操作。在文件压缩完成后,我们通过创建一个下载链接并触发下载,用户可以下载压缩后的文件。 需要注意的是,上述代码中使用的CompressedStream是一个自定义对象,用于实现文件流的压缩功能。你可能需要根据自己的需求来实现该对象。同时,代码中的300字限可能无法完整展示XML的转换压缩过程,但这个代码段应该可以给你个大致的思路和操作方法。 ### 回答3: 要将Javascript中的XML内容转换为流文件并压缩,您可以遵循以下步骤: 1. 首先,将XML内容转换为字符串格式。可以使用`XMLSerializer`对象的`serializeToString()`方法将XML对象转换为字符串。 2. 接下来,创建一个新的Blob对象,将XML字符串作为其内容,并设置其类型为&quot;text/xml&quot;。使用Blob对象可以将数据转换为可操作的二流。 3. 然后,将Blob对象传递给FileReader实例的`readAsArrayBuffer()`方法,以读取Blob对象的内容到ArrayBuffer中。使用ArrayBuffer可以处理二数据。 4. 一旦读取到ArrayBuffer中,我们可以使用JSZip库来创建一个新的ZIP文件。通过循环读取ArrayBuffer的每个字节,并将其添加到ZIP文件中。 5. 最后,使用JSZip库的`generateAsync()`方法将ZIP文件转换为流文件。此方法返回一个Promise对象,我们可以使用它来获取流文件。 以下是一个示例代码: ```javascript const xmlContent = &#39;&lt;root&gt;&lt;element&gt;...&lt;/element&gt;&lt;/root&gt;&#39;; // 替换为您的XML内容 // 将XML内容转换为Blob对象 const xmlBlob = new Blob([xmlContent], {type: &#39;text/xml&#39;}); // 读取Blob对象的内容到ArrayBuffer const fileReader = new FileReader(); fileReader.onload = function() { const arrayBuffer = this.result; // 创建一个新的ZIP文件 const zip = new JSZip(); // 将ArrayBuffer写入ZIP文件 zip.file(&#39;xmlfile.xml&#39;, arrayBuffer); // 生成ZIP文件并转换为流文件 zip.generateAsync({type: &#39;blob&#39;}) .then(function(content) { // content即为压缩的流文件,可以使用它一步操作 console.log(content); }); }; fileReader.readAsArrayBuffer(xmlBlob); ``` 请注意,上述代码中使用了JSZip库来创建和操作ZIP文件。您需要在项目中引入JSZip库才能使用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值