C++ - 在常量数据中使用zlib
要使用zlib压缩/解压缩数据,首先需要设置一个名为z_stream
的结构。 z_stream
有两个非常量指针next_in
和next_out
。C++ - 在常量数据中使用zlib
如果我想要做这样的功能:
void ungzip(std::vector<unsigned char>& dst,const std::vector<unsigned char>& src)
{
z_stream strm;
// more code
}
和其他类似的,
void gzip (std::vector<unsigned char>& dst,const std::vector<unsigned char>& src);
我应该怎么办?
在本地std::vector<unsigned char>
std::vector<unsigned char> tmp(src);
复制src和使用它作为源或设定指针这样,strm.next_in = const_cast<char*>(&src[0])
?
zlib是否保留输入数据?
可能最简洁的方法是在编译时只定义ZLIB_CONST
,以便将输入指针定义为const unsigned char *
。
但是请注意,简单地抛弃常量确实会起作用(如果指向的字符实际上不是常量,这是合法的)。 该代码,这应该是:
strm.next_in = (unsigned char *)&src[0];
,或者如果你是到那种东西丑陋const_cast
变种。
如果我正在使用Linux发行版提供的软件包,我应该重新为我的程序重新编译zlib吗? –
@ R.F.Luis:然后进入选项2:只需传递'(char *)&src [0]'; “std :: vector”中的数据不能是const的,所以抛弃const性是安全的。 – 6502
src是一个'const std :: vector
我会建议通过迭代器接受输入:使用这种设计,它限制了调用者将数据存储在'vector中' –
zlib不接触输入数据。它被看作是“const”。 'next_in'默认不是'const',因为许多应用程序使用zlib之外的'next_in'来读取它们的数据。使它成为'const'会破坏这些应用程序。 –