Potrzebuję prostej kompresji i dekompresji std :: string w C++. Spojrzałem na to site, a kod jest dla tablicy znaków. Co chcę wdrożyć są dwie funkcje:Prosta kompresja i dekompresja stringów Cli Zlib
std::string original = "This is to be compressed!!!!";
std::string compressed = string_compress(original);
std::cout << compressed << std::endl;
std::string decompressed = string_decompress(compressed);
std::cout << decompressed << std::endl;
próbowałem kompresję doładowania jak:
std::string CompressData(const std::string &data)
{
std::stringstream compressed;
std::stringstream decompressed;
decompressed << data;
boost::iostreams::filtering_streambuf<boost::iostreams::input> out;
out.push(boost::iostreams::zlib_compressor());
out.push(decompressed);
boost::iostreams::copy(out, compressed);
return compressed.str();
}
std::string DecompressData(const std::string &data)
{
std::stringstream compressed;
std::stringstream decompressed;
compressed << data;
boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
in.push(boost::iostreams::zlib_decompressor());
in.push(compressed);
boost::iostreams::copy(in, decompressed);
return decompressed.str();
}
ale kod czasami daje znaki puste w ciąg tj \ u0000. Jak postępować, jeśli skompresowane dane zawierają te puste znaki. Czy zwracany jest typ string? Jak mogę zaimplementować funkcję string_compress i string_decompress używając zlib?
skompresowanych danych jest tylko dane binarne. To nie jest rozsądny, czytelny ciąg (w sensie ludzkim). Nic więc dziwnego, że widzisz "dziwne" dane binarne w skompresowanym łańcuchu. To znaczy przecież dokładnie to, co to jest. – Cornstalks
Dlaczego ważne jest, aby w skompresowanym łańcuchu były puste znaki? – Galik
Ponieważ skompresowana wiadomość jest wysyłana do serwera jako ciąg Json. Ale serwer nie może otrzymać pełnej wiadomości, gdy zobaczy znak zerowy. – Pant