TkAstral3D/packages/sdk/lib/utils/handler/pako.ts
2025-10-04 23:36:07 +08:00

55 lines
1.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pako from "pako";
import { encode, decode } from 'js-base64';
// 压缩
export const zip = (data, needEncode = true) => {
if (!data) return data
// 判断数据是否需要转为JSON
const dataJson: string = typeof data !== 'string' ? JSON.stringify(data) : data
// 使用Base64.encode处理字符编码兼容中文
const str = needEncode ? encode(dataJson) : dataJson;
let binaryString = pako.gzip(str) as number[];
let arr = Array.from(binaryString);
let s = "";
arr.forEach((item: number) => {
s += String.fromCharCode(item)
})
return btoa(s)
}
// 解压
export const unzip = (b64Data, needDecode = true) => {
let strData = atob(b64Data);
let charData = strData.split('').map(function (x) {
return x.charCodeAt(0);
});
let binData = new Uint8Array(charData);
let data = pako.ungzip(binData);
// ↓切片处理数据,防止内存溢出报错↓
let str = '';
const chunk = 8 * 1024
let i;
for (i = 0; i < data.length / chunk; i++) {
str += String.fromCharCode.apply(null, data.slice(i * chunk, (i + 1) * chunk));
}
str += String.fromCharCode.apply(null, data.slice(i * chunk));
// ↑切片处理数据,防止内存溢出报错↑
const unzipStr = needDecode ? decode(str) : str;
let result;
// 对象或数组进行JSON转换
try {
result = JSON.parse(unzipStr)
} catch (error) {
if (/Unexpected token o in JSON at position 0/.test(error as string)) {
// 如果没有转换成功,代表值为基本数据,直接赋值
result = unzipStr
}
}
return result;
}