Zlib/deflate 并不完全支持共享字典,但您可以“预加载”输出流最多 32kB 的数据。例如在 Python 中:
>>> from zlib import compressobj
>>> c = compressobj(zdict="abcdefghijklmnopqrstuvwxyz")
>>> c.compress(b"abcdefghijklmnopqrstuvwxyz")
b'x\xbb\x90\x86\x0b '
>>> c.flush()
b'K\xc4)\x03\x00\x90\x86\x0b '
输出比没有字典时短很多:
>>> compress(b"abcdefghijklmnopqrstuvwxyz")
b'x\x9cKLJNIMK\xcf\xc8\xcc\xca\xce\xc9\xcd\xcb/(,*.)-+\xaf\xa8\xac\x02\x00\x90\x86\x0b '
问题是:有没有办法使用内置的 Web API 来解压 Javascript 中字典压缩的输出?
我 99% 确定答案是否定的;只是检查一下我没有错过什么。
这里是一个 Python 示例,说明如何使用字典解压缩 zlib 流,而无需使用 zdict
选项,希望可以适应 Javascript:
import zlib
# compress dictionary using dictionary, zlib stream in z
d = b'abcdefghijklmnopqrstuvwxyz'
c = zlib.compressobj(zdict=d)
z = c.compress(d)
z += c.flush()
# decompress z using dictionary, without having to use zdict, result in r
u = zlib.decompressobj(wbits=-15)
h = (b'\0' + len(d).to_bytes(2, 'little') +
(65535 - len(d)).to_bytes(2, 'little'))
r = u.decompress(h + d) # feed dictionary
r += u.decompress(z[6:]) # decompress raw deflate from z
r += u.flush()
r = r[len(d):] # discard dictionary
if int.from_bytes(u.unused_data, 'big') != zlib.adler32(r):
print('** failed integrity check')