压缩Guid';Javascript中的s

压缩Guid';Javascript中的s,javascript,jquery,compression,Javascript,Jquery,Compression,将guid字符串压缩/编码为较小的字符串表示形式,然后将其解码回guid的任何简单算法。任何可用的javascript代码 例如,0a0a8907-40b9-4e81-8c4d-d01af26efb78使用36个字符。我是否可以简化为大约20-24个字符的字符串表示…将十六进制值转换为32位块中的整数,然后使用base 64重新编码生成的字符串。我找到了一个可以将十六进制转换为base 64并向后转换的字符串。 您基本上需要从GUID中删除每个连字符并对其进行编码: var guid = "0a

将guid字符串压缩/编码为较小的字符串表示形式,然后将其解码回guid的任何简单算法。任何可用的javascript代码


例如,0a0a8907-40b9-4e81-8c4d-d01af26efb78使用36个字符。我是否可以简化为大约20-24个字符的字符串表示…

将十六进制值转换为32位块中的整数,然后使用base 64重新编码生成的字符串。

我找到了一个可以将十六进制转换为base 64并向后转换的字符串。 您基本上需要从GUID中删除每个连字符并对其进行编码:

var guid = "0a0a8907-40b9-4e81-8c4d-d01af26efb78";
var encoded = guid.replace(/-/g, "");
encoded = hexToBase64(encoded);
然后,接收端可以对其进行解码并将其重新组合在一起:

var chunks = [];
chunks.push( decoded.substring(0, 8) );
chunks.push( decoded.substring(8, 12) );
chunks.push( decoded.substring(12, 16) );
chunks.push( decoded.substring(16, 20) );
chunks.push( decoded.substring(20) );
decoded = chunks.join("-");
示例GUID的编码版本为
CgqJB0C5ToGMTdAa8m77eA==
,长度为24个字符


查看一个工作示例。

这里有一个简单的例程,它不需要外部库,而是以12-24个实际字节存储数据:

function encode(s){
  return s.split("-").map(function(a,b,c){ 
   return a.split(/(\w{4})/).filter(Boolean).map(function(aa,bb,cc){
               return  String.fromCharCode(parseInt(aa, 16))
          }).join("");
  }).join("|");
}


function decode(s){
  return s.split("|").map(function(a){     
     return a.split("").map(function(aa){return String("0"+aa.charCodeAt(0).toString(16)).slice(-4) }).join("")
  }).join("-");
}



var guid = "0a0a8907-40b9-4e81-8c4d-d01af26efb78"; //36 chars
var encoded=encode(guid); //=== "ਊ複|䂹|亁|豍|퀚ﭸ"
var guid2=decode(encoded);

alert([guid, guid2, encoded].join("\n"));

/* shows:
 0a0a8907-40b9-4e81-8c4d-d01af26efb78
 0a0a8907-40b9-4e81-8c4d-d01af26efb78
 ਊ複|䂹|亁|豍|퀚ﭸ
 12b
*/

这充分利用了本地存储,因为它可以存储未编码的宽字符。如果你必须转换成ascii码,那么你在浪费时间和空间进行此例行程序…

为什么在哪里/如何使用它?我正在将一长串用分号分隔的guid写入二维码。我只需要减小这个字符串的大小……因为guid或多或少是随机的,或者至少不追求明显的模式,我认为压缩根本没有好处。你测试过你的字符串的“可压缩性”吗?因为quid总是相同的长度,我不明白你为什么需要分号。我的字符串也可以包含随机文本。。所以我必须用某种分离器把它分开..是的。。解码的字符串不正确。。也许我是在看它来纠正它。。。Thanks@Jason现在终于可以工作了。检查更新的fiddle(更新2)在C#中与此代码等效的内容。。特别是函数hexToBase64。。如果你知道的话..我看到编码的字符串总是在末尾附加==的。。所以我能做的就是在编码时删除这些。。。我将得到22个字符。。在解码之前,我将附加==。。。。。希望它在所有情况下都能工作谢谢Dandavis。。它适合本地存储。。但是因为我必须在二维码上写数据。。此编码字符串将占用大量空间。。