使用 Javascript 中的共享字典解压缩 zlib/deflate

问题描述 投票:0回答:1

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% 确定答案是否定的;只是检查一下我没有错过什么。

javascript compression zlib deflate shared-directory
1个回答
0
投票

这里是一个 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')

	
© www.soinside.com 2019 - 2024. All rights reserved.