基于前后台数据交互,因数据传递量过大原因,因此对前后台数据进行压缩数据传输交互,这里使用的是Vue3、PHP、Python进行的数据交互处理,前后数据请求交互代码在此不做赘述,直接写交互请求数据压缩部分:
一、Vue前端使用:
1、前端先安装扩展:
npm install pako
2、数据压缩
import pako from "pako";
let text = '123456'
const u8ArrData = pako.deflateRaw(text , {
to: "string",
});
let CHUNK_SIZE = 0x8000;
let index = 0;
let length = u8ArrData.length;
let result = '';
let slice;
while (index < length) {
slice = u8ArrData.subarray(index, Math.min(index + CHUNK_SIZE, length));
result += String.fromCharCode.apply(null, slice);
index += CHUNK_SIZE;
}
let newText = btoa(result)
console.log(newText )
3、解压缩数据
import pako from "pako";
// 解压缩数据
let bText = "MzQyNjE1AwA=";
let strData = atob(bText);
// 将二进制字符串转换为字符数数组
const charData = strData.split("").map(function (x) {
return x.charCodeAt(0);
});
// 将数字数组转换为字节数组
const binData = new Uint8Array(charData);
const data = pako.inflateRaw(binData, {
to: "string",
});
console.log(data);
二、PHP使用部分代码如下:
1、数据压缩
<?php
$str = '123456';
$data = base64_encode(gzdeflate($str));
echo $data;
2、数据解压缩
<?php
$bStr = 'MzQyNjE1AwA=';
$data = gzinflate(base64_decode($bStr));
echo $data;
三、Python使用部分代码如下:
1、数据压缩
import zlib,base64
data = '123456'.encode('utf-8') #将str转bytes
deflate_compress = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS)
compressed_data = deflate_compress.compress(data)+ deflate_compress.flush()
bStr = base64.b64encode(compressed_data).decode() #bytes转回str
print(bStr)
2、数据解压缩
import zlib,base64
bStr = 'MzQyNjE1AwA='
decompressed_data = zlib.decompress(base64.b64decode(bStr),-zlib.MAX_WBITS)
print(decompressed_data.decode()) #将bytes转会str
Python运行如果出现下面的错误:
zlib.error: Error -3 while decompressing: incorrect header check
这可能是因为您尝试检查不存在的标头,例如您的数据遵循RFC 1951(deflate压缩格式),而不是RFC 1950(zlib压缩格式)或RFC 1952(gzip压缩格式)。
选择windowBits
但是zlib可以解压缩所有这些格式:要(解压缩)deflate格式,请使用wbits = -zlib.MAX_WBITS
要(解压缩)zlib格式,请使用wbits = zlib.MAX_WBITS
要(解压缩)gzip格式,请使用wbits = zlib.MAX_WBITS | 16