2017-07-06 61 views
3

要使用zlib压缩/解压缩数据,首先需要设置一个名为z_stream的结构。 z_stream有两个非常量指针next_innext_outC++ - 在常量数据中使用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是否保留输入数据?

+0

我会建议通过迭代器接受输入:使用这种设计,它限制了调用者将数据存储在'vector 中' –

+1

zlib不接触输入数据。它被看作是“const”。 'next_in'默认不是'const',因为许多应用程序使用zlib之外的'next_in'来读取它们的数据。使它成为'const'会破坏这些应用程序。 –

回答

1

可能最简洁的方法是在编译时只定义ZLIB_CONST,以便将输入指针定义为const unsigned char *

但是请注意,简单地抛弃常量确实会起作用(如果指向的字符实际上不是常量,这是合法的)。 该代码,这应该是:

strm.next_in = (unsigned char *)&src[0]; 

,或者如果你是到那种东西丑陋const_cast变种。

+0

如果我正在使用Linux发行版提供的软件包,我应该重新为我的程序重新编译zlib吗? –

+0

@ R.F.Luis:然后进入选项2:只需传递'(char *)&src [0]'; “std :: vector”中的数据不能是const的,所以抛弃const性是安全的。 – 6502

+0

src是一个'const std :: vector &'所以数据必须是'const'并且需要使用'const_cast'进行转换。如果对象是_const qualified_,则不能更改它。 –