使用 pako(javascript 中的 zlib) 压缩,使用 zlib(python) 解压缩无效
Compressed with pako(zlib in javascript), decompressing with zlib(python) not working
使用 pako(https://github.com/nodeca/pako)Pako 在 javascript 中进行压缩的代码。它压缩字符串 't'
var compressedString = pako.gzip('t', {level: 4, to: 'string'}));
$.ajax('/decompress', {string: compressedString})
执行解压缩的 /decompress 中的代码
from cgi import parse_qs, escape
import json
import zlib
def application(environ, start_response):
status = '200 OK'
try:
request_body_size = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
request_body = environ['wsgi.input'].read(request_body_size)
d = parse_qs(request_body)
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
inputString = d.get('string')[0]
# Use same wbits(=31) as used by pako
decompressed = zlib.decompress(inputString, 31);
return 'done'
解压抛出以下错误。 zlib.decompress 行发生错误。
error: Error -3 while decompressing data: incorrect header check
我还尝试对 inputString(
inputString.encode('utf-8')
) 但它也会抛出错误。
to: 'string'
此选项通过将每个字节映射到具有相同编号的字符,将输出字节序列走私到 JS (Unicode) String
。 (这相当于使用 ISO-8859-1 编码进行解码。)
$.ajax('/decompress', {string: compressedString})
XMLHttpRequest 需要将 (Unicode) 字符串值编码回字节序列以通过网络传输(URL-编码)。它使用的编码是 UTF-8,而不是 ISO-8859-1,因此网络上的字节序列与 GZip 压缩器输出的字节序列不同。
您可以在 Python 结束时通过在 URL 解码步骤之后重新编码来撤消此过程:
d = parse_qs(request_body).decode('utf-8').encode('iso-8859-1')
现在您应该拥有与压缩器相同的字节序列。
将字节作为 UTF-8 编码的代码点发送,然后 URL 对其中的非 ASCII 字节进行编码,这将使网络流量膨胀到原始字节所需的四倍左右向上,这反而会破坏压缩的良好效果。
如果您只是 post 数据字符串本身作为 Python 脚本的请求主体,您可能会丢失 URL 编码,然后您的请求将仅(!) 比原始压缩数据多大约 50%。要做得更好,您需要开始考虑直接发送原始字节 as a ByteArray, or perhaps using multipart form-data。无论哪种方式都存在浏览器兼容性问题。
使用 pako(https://github.com/nodeca/pako)Pako 在 javascript 中进行压缩的代码。它压缩字符串 't'
var compressedString = pako.gzip('t', {level: 4, to: 'string'}));
$.ajax('/decompress', {string: compressedString})
执行解压缩的 /decompress 中的代码
from cgi import parse_qs, escape
import json
import zlib
def application(environ, start_response):
status = '200 OK'
try:
request_body_size = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
request_body = environ['wsgi.input'].read(request_body_size)
d = parse_qs(request_body)
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
inputString = d.get('string')[0]
# Use same wbits(=31) as used by pako
decompressed = zlib.decompress(inputString, 31);
return 'done'
解压抛出以下错误。 zlib.decompress 行发生错误。
error: Error -3 while decompressing data: incorrect header check
我还尝试对 inputString(
inputString.encode('utf-8')
) 但它也会抛出错误。
to: 'string'
此选项通过将每个字节映射到具有相同编号的字符,将输出字节序列走私到 JS (Unicode) String
。 (这相当于使用 ISO-8859-1 编码进行解码。)
$.ajax('/decompress', {string: compressedString})
XMLHttpRequest 需要将 (Unicode) 字符串值编码回字节序列以通过网络传输(URL-编码)。它使用的编码是 UTF-8,而不是 ISO-8859-1,因此网络上的字节序列与 GZip 压缩器输出的字节序列不同。
您可以在 Python 结束时通过在 URL 解码步骤之后重新编码来撤消此过程:
d = parse_qs(request_body).decode('utf-8').encode('iso-8859-1')
现在您应该拥有与压缩器相同的字节序列。
将字节作为 UTF-8 编码的代码点发送,然后 URL 对其中的非 ASCII 字节进行编码,这将使网络流量膨胀到原始字节所需的四倍左右向上,这反而会破坏压缩的良好效果。
如果您只是 post 数据字符串本身作为 Python 脚本的请求主体,您可能会丢失 URL 编码,然后您的请求将仅(!) 比原始压缩数据多大约 50%。要做得更好,您需要开始考虑直接发送原始字节 as a ByteArray, or perhaps using multipart form-data。无论哪种方式都存在浏览器兼容性问题。