研究Google chart API的时候发现它提供的数据压缩算法不错,可以把纯数字的数组压缩成很短的一个字符串,分享如下:
var simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; function simpleEncode(values,maxValue) { var chartData = ['s:']; for (var i = 0; i < values.length; i++) { var currentValue = values[i]; if (!isNaN(currentValue) && currentValue >= 0) { chartData.push(simpleEncoding.charAt(Math.round((simpleEncoding.length-1) * currentValue / maxValue))); } else { chartData.push('_'); } } return chartData.join(''); } |
测试例子:
var valueArray = new Array(20,100,40,50,60,81,74); var maxValue = 100; document.write(simpleEncode(valueArray,maxValue)); |
本站内容受著作权法保护。个人 blog 转载时请遵循 “署名-非商业用途-保持一致” 的创作共用协议;商业网站或未授权媒体不得复制本站内容。
怎么解压呀? 老大
@verygood
其实这个算法很简单,使用大小写字母与数字,A代表0,B代表1,直至9代表61,共包含 62 个数值。
基于此,就有思路了吧?也可以直接根据js函数反推。
其实这本身就是有损压缩,完全解压数据不精确。
附个php小算法解压:
//new Array(20,100,40,50,60,81,74);
$str = “M9Yflxt”;
$maxValue = 100;
$simpleEncoding = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789’;
$original = “”;
for($i = 0;$i < strlen($str);$i++) { $s = $str[$i]; $pos = strpos($simpleEncoding, $s); $original .= round($maxValue * $pos / (strlen($simpleEncoding)-1)) . ","; } echo substr($original, 0, -1);