在发送之前压缩数据 – 控制字符?

在多人游戏设置中,我打算在发送之前使用zlib来压缩更大的字符串。 我将结果数据放回到字符串中,这些字符串将使用TCP作为字节流发送。

我的问题是,我还需要将控制字符放入字符串中。 例如,我需要将原始字符串长度(以纯文本格式)添加到压缩字符串的前面,并使用某些符号(如“|”)将其与压缩数据分开。

但我找不到知道哪些字节是实际内容以及哪些字节是控制字符的方法。 是否存在zlib-compressed-string永远不会包含的任何字符(除了0,我不能使用,因为它标记了c-string的结尾),我可以使用它来分离“元数据”和“压缩数据”?

如果你控制压缩blob的创建和它们的解压缩,你可以将大小预先设置为压缩数据(可以通过在缓冲区的开头保留一些字节),然后在解压缩时跳过大小并将指针传递给压缩数据到解压缩实用程序。 这样您就不必担心压缩数据的大小:解压缩代码永远不会看到带有大小信息的字节。

不,没有字节值无法包含在zlib流中。 但是,zlib流是自终止的 。 通过简单地使用inflate()来解压缩流,您将在返回Z_STREAM_END时找到结束。 inflate()未使用的字节是紧跟在zlib流之后的下一个字节。 完成解压缩后,您将知道流中有多少压缩数据字节,以及生成了多少未压缩字节。

如果您只是简单地处理整个流,并按顺序嵌入zlib流,则无需在任何位置存储压缩或未压缩的长度。 该信息是zlib数据中固有的。 如果您需要非顺序地处理流,或者希望在zlib数据之后访问流中的其他数据而不必解压缩zlib流,则只需要存储此类数据。

你是如何进行压缩的? 如果您通过外部程序输出输出,那么您可以做的并不多,但如果您正在使用内部内容,例如压缩streambuf,则应该能够在必要时输出到原始streambuf。 例如,使用来自boost::iostream过滤流,您可以编写长度,然后推送压缩流,写入要压缩的数据,然后弹出压缩流,并继续编写纯文本。 (在更改filter堆栈之前,您可能必须在此处插入明智的刷新。)或者您应该能够将要压缩的部分压缩到缓冲区中,并使用std::ostream::write来输出它们。