在多人游戏设置中,我打算在发送之前使用zlib来压缩更大的字符串。我将结果数据放回到字符串中,这些字符串将使用TCP作为字节流发送。
我的问题是,我还需要将控制字符放入字符串中。例如,我需要将原始字符串长度(以纯文本格式)添加到压缩字符串的前面,并使用某些符号(如“|”)将其与压缩数据分开。
但是我找不到知道哪些字节是实际内容以及哪些字节是控制字符的方法。是否存在zlib-compressed-string永远不会包含的任何字符(除了0,我不能使用,因为它标记了c-string的结尾),我可以使用它来分离“元数据”和“压缩数据”?
答案 0 :(得分:1)
不,zlib流中不包含任何字节值。但是,zlib流是自终止。只需使用inflate()
解压缩流,就会在返回Z_STREAM_END
时找到结束。 inflate()
未使用的字节是紧跟在zlib流之后的下一个字节。完成解压缩后,您将知道流中有多少压缩数据字节,以及生成了多少未压缩字节。
如果您只是简单地处理整个流,并按顺序嵌入zlib流,则无需在任何位置存储压缩或未压缩的长度。该信息是zlib数据中固有的。如果您需要非顺序地处理流,或者希望在zlib数据之后访问流中的其他数据而不必解压缩zlib流,则只需要存储此类数据。
答案 1 :(得分:0)
你是如何进行压缩的?如果你正在输出输出
通过一个外部程序,你可以做的并不多,但是如果
你正在使用内部的东西,比如压缩的streambuf,
你应该能够输出到原始的streambuf时
必要。使用来自boost::iostream
的过滤流,用于
例如,您可以编写长度,然后推压缩
流,写入要压缩的数据,然后弹出
压缩流,并继续编写纯文本。 (你可以
在改变之前,必须在这里和那里插入一个明智的冲洗
过滤器堆栈。)或者你应该能够压缩零件
你想压缩成一个缓冲区,并使用
std::ostream::write
输出它们。
答案 2 :(得分:0)
如果你控制压缩blob的创建和它们的解压缩,你可以在压缩数据前加上大小(可以通过在缓冲区的开头保留一些字节),然后在解压缩时跳过大小并传递指针将数据压缩到解压缩实用程序。这样您就不必担心压缩数据的大小:解压缩代码永远不会看到带有大小信息的字节。