我可以使用 zlib header 作为分隔符吗?

Can I use the zlib header as a delimiter?

我有多个用 zlib 压缩的数据块。我想连接这些数据块并将其存储在一个文件中。

显然,我可以使用 JSON 或 XML 之类的东西来分隔 zlib 数据块,但我想知道是否要保存 space,我可以只搜索下一个 78 0178 9C78 DA?

基本上我的问题是,从理论上讲,这些字节组合是否可以存在于 zlib 数据流中,或者我可以确定当我找到这些字节组合之一时,一个新的 zlib 数据块开始,并且结束在找到的位置减一?

我知道未压缩数据块的长度始终为 1024 字节或更少,因此压缩流永远不会超过 1024 字节。

不,你不能。任何字节序列都可以出现在压缩数据中。在任意字节位置,找到有效 zlib 的概率为 1/1024 header。所以你会在一个长的压缩流中找到 lot 个有效的 zlib headers 而实际上不是 zlib headers.

您可以创建自己的字节填充方案来包装任意数据,包括 zlib 流或其他任何数据,以确保某些序列不会出现,除非它们确实是分隔符。这样的方案可能会导致数据的任意小扩展。例如,如果您在数据中发现连续三个 0xff,则插入一个 0x00 字节。然后 0xff 0xff 0xff 0xff 可以作为分隔符,因为它永远不会出现在数据中。这只会将流平均扩展大约 0.000006%。