JavaScript 长字符串缩短和还原,长度预计能缩短50%以上

用于 uniapp、微信小程序的WebView PostMessage传数据

用于 网页跳转参数

方案一:lz-string库

npm i lz-string


const LZString = require("lz-string")
var string ='UEsDBAoAAAAIAA48LVU9cySLbAEAAJoFAAATAAAAW0NvbnRlbnRfVH';
console.log("样本大小为:" + string.length); //参考:字符长度 20000
var compressed = LZString.compress(string);
console.log(compressed)
console.log("压缩样本的大小为:" + compressed.length); //参考:压缩后字符长度 9800
string = LZString.decompress(compressed);
console.log("Sample is:" + string);

方案二:纯js方法

	/* *
	 * 压缩字符串
	 */
	function compress(strNormalString) {
		console.log(" 压缩前长度: " + strNormalString.length);
		var strCompressedString = "";
		var ht = new Array();
		for (i = 0; i < 128; i++) {
			ht[i] = i;
		}

		var used = 128;
		var intLeftOver = 0;
		var intOutputCode = 0;
		var pcode = 0;
		var ccode = 0;
		var k = 0;

		for (var i = 0; i < strNormalString.length; i++) {
			ccode = strNormalString.charCodeAt(i);
			k = (pcode << 8) | ccode;
			if (ht[k] != null) {
				pcode = ht[k];
			} else {
				intLeftOver += 12;
				intOutputCode <<= 12;
				intOutputCode |= pcode;
				pcode = ccode;
				if (intLeftOver >= 16) {
					strCompressedString += String.fromCharCode(intOutputCode >> (intLeftOver - 16));
					intOutputCode &= (Math.pow(2, (intLeftOver - 16)) - 1);
					intLeftOver -= 16;
				}
				if (used < 4096) {
					used++;
					ht[k] = used - 1;
				}
			}
		}

		if (pcode != 0) {
			intLeftOver += 12;
			intOutputCode <<= 12;
			intOutputCode |= pcode;
		}

		if (intLeftOver >= 16) {
			strCompressedString += String.fromCharCode(intOutputCode >> (intLeftOver - 16));
			intOutputCode &= (Math.pow(2, (intLeftOver - 16)) - 1);
			intLeftOver -= 16;
		}

		if (intLeftOver > 0) {
			intOutputCode <<= (16 - intLeftOver);
			strCompressedString += String.fromCharCode(intOutputCode);
		}

		console.log(strCompressedString + " 压缩后长度: " + strCompressedString.length);
		return strCompressedString;
	}

	/* *
	 * 解压缩字符串
	 */
	function decompress(strCompressedString) {
		var strNormalString = "";
		var ht = new Array();

		for (i = 0; i < 128; i++) {
			ht[i] = String.fromCharCode(i);
		}

		var used = 128;
		var intLeftOver = 0;
		var intOutputCode = 0;
		var ccode = 0;
		var pcode = 0;
		var key = 0;

		for (var i = 0; i < strCompressedString.length; i++) {
			intLeftOver += 16;
			intOutputCode <<= 16;
			intOutputCode |= strCompressedString.charCodeAt(i);

			while (1) {
				if (intLeftOver >= 12) {
					ccode = intOutputCode >> (intLeftOver - 12);
					if (typeof(key = ht[ccode]) != "undefined") {
						strNormalString += key;
						if (used > 128) {
							ht[ht.length] = ht[pcode] + key.substr(0, 1);
						}
						pcode = ccode;
					} else {
						key = ht[pcode] + ht[pcode].substr(0, 1);
						strNormalString += key;
						ht[ht.length] = ht[pcode] + key.substr(0, 1);
						pcode = ht.length - 1;
					}

					used++;
					intLeftOver -= 12;
					intOutputCode &= (Math.pow(2, intLeftOver) - 1);
				} else {
					break;
				}
			}
		}
		console.log("解压缩后长度:" + strNormalString.length);
		return strNormalString;
	}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值