2017-07-06 2 views
3

Pour compresser/décompresser des données avec zlib, je dois d'abord configurer une structure appelée z_stream. z_stream a deux pointeurs non const appelés next_in et next_out.C++ - Utilisation de zlib avec des données const

Si je veux faire une fonction comme ceci:

void ungzip(std::vector<unsigned char>& dst,const std::vector<unsigned char>& src) 
{ 
    z_stream strm; 
    // more code 
} 

et d'autres comme,

void gzip (std::vector<unsigned char>& dst,const std::vector<unsigned char>& src); 

Qu'est-ce que je dois faire?

Copie src dans un contexte local std::vector<unsigned char>

std::vector<unsigned char> tmp(src); 

et l'utiliser comme pointeur source ou le comme ça, strm.next_in = const_cast<char*>(&src[0])?

Est-ce que zlib conserve les données d'entrée?

+0

Je recommanderais d'accepter l'entrée via les itérateurs: avec ce design, il contraint l'appelant à stocker les données dans 'le vecteur ' –

+1

zlib ne touche pas les données d'entrée. Il est traité comme s'il était 'const'. 'next_in' n'est pas' const' par défaut car de nombreuses applications utilisent 'next_in' en dehors de zlib pour lire leurs données. Le faire 'const' casserait ces applications. –

Répondre

1

Probablement la manière la plus propre serait de simplement définir ZLIB_CONST lors de la compilation afin que le pointeur d'entrée soit défini comme const unsigned char * à la place. Notez toutefois que le simple fait d'éliminer la constance va effectivement fonctionner (il est légal que le caractère pointé ne soit pas réellement constant). Le code pour cela devrait être:

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

ou plus laid const_cast variante si vous êtes dans ce genre de choses.

+0

Si j'utilise le paquet fourni par une distribution Linux, dois-je recompiler zlib juste pour mon programme? –

+0

@ R.F.Luis: Alors allez pour l'option 2: Passez juste '(char *) & src [0]'; les données dans un 'std :: vector' ne peuvent pas être const, il est sûr de rejeter const-ness. – 6502

+0

src est un 'const std :: vector &' donc les données doivent être 'const' et doivent être castées en utilisant' const_cast'. Si l'objet est _const qualified_, vous ne pouvez pas le changer. –