对于 4KB 原始数据,Zlib 中未命中 15 的代码长度

Code length of 15 not being hit in Zlib for 4KB Raw Data

我正在验证执行解压缩(膨胀)的硬件设计块。解压缩数据输出应始终为 4 KiB。作为测试数据,我使用 zlib 的 deflate 一次压缩 4 KiB 数据块,并将其作为我测试的输入提供。我 运行 多元回归,我从来没有观察到代码长度为 15 的情况。你对如何获得它有什么建议,或者为什么它不可能?

给你:

eF4F4cGBZdmybbnJijFt7eOR931S/14B////3//7f//v//7v//7vf//73//+97///ffff//9
999///3333///v379+/fv3///v379+/fv3///v39/f39/f39/f39/f39/f39/f39/f39/f39
/f39/X6/3+/3+/1+v9/v9/v9fr/f7/f7/X6/3+/3+/1+v9/v9/v9fr/f7/f7vu/7vu/7vu/7
vu/7vu/7vu/7vu/7vu/7vu/7vu/7vu/7vu/7vu/7vu/7vu/7vu/7vu/7vu/7vu9777333nvv
vffee++9995777333nvvvffee++9995777333nvvvffee++9995777333nvvvffee++99957
77333nvvvffee++99957793d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d
3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d
3d3d3d3d3d22bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2
bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2bdu2
bdu2bdu2bdu2bdu2bdu2bdu2bdtWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVFQAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAA8P8BVoseLg==

这是 zlib 流的 Base64 编码,可解压缩为 4096 字节,具有 15 位符号。它是通过生成卢卡斯数 2、1、3、4、7、11、...、521、843 构建的。初始 2 递减为 1,以说明 deflate 中的块结束符号。然后用这些频率发射 15 个符号。 (我选择了小写字母 a..o,其中 a 出现了 843 次。)这导致了一个 2205 字节的序列,其中,块结束符号,是可以产生 15 位代码的最小可能输入。那还不到你的4096,所以确实可以生成你要找的测试向量。

然后我又追加了 1891 a,将其填充为 4096 字节。这不会改变生成的霍夫曼代码。然后,您使用仅 Huffman 策略(zlib 中的 Z_HUFFMAN_ONLYpigz -zH)使用 zlib 对该序列进行压缩,以避免 LZ77 压缩长而重复的符号字符串。

如果您只想要一个原始的 deflate 流,则删除 zlib 流的前两个和最后四个字节。