gpt4 book ai didi

C++ zlib 压缩文件中的字符串

转载 作者:太空宇宙 更新时间:2023-11-04 16:22:53 25 4
gpt4 key购买 nike

我一直在尝试压缩字符串并将它们保存到文本文件中,然后读取数据并解压缩。但是,当我尝试解压缩读取的字符串时,我得到一个 Z_BUF_ERROR (-5),并且该字符串可能会也可能不会解压缩。

在控制台中,我可以压缩/解压一整天:

std::string s = zlib_compress("HELLO asdfasdf asdf asdfasd f asd f asd f awefo@8 892y*(@Y");
std::string e = zlib_decompress(s);

字符串 e 将毫无困难地返回原始字符串。

但是,当我这样做时:

zlib_decompress(readFile(filename));

我得到一个 Z_BUF_ERROR。我认为这可能部分是由于文件中的隐藏字符,但我不太确定。

这是我的readFile 函数:

std::string readFile(std::string filename)
{
std::ifstream file;
file.open(filename.c_str(), std::ios::binary);

file.seekg (0, std::ios::end);
int length = file.tellg();
file.seekg (0, std::ios::beg);

char * buffer = new char[length];

file.read(buffer, length);
file.close();

std::string data(buffer);

return data;
}

当我写压缩数据时,我使用:

void writeFile(std::string filename, std::string data)
{
std::ofstream file;
file.open(filename.c_str(), std::ios::binary);
file << data;
file.close();
}

如果需要,我会展示我用来解压缩的函数,但如果它在没有文件 IO 的情况下工作,我觉得问题是 IO 问题。

最佳答案

首先,您要处理的二进制数据可能嵌入也可能不嵌入空字符。 std::string 并不是正确的容器,但如果操作正确,您可以处理嵌入的空字符。但是,使用 std::string 来存储某些东西记录了特定的期望,而您正在打破该约定。

其次,std::string data(buffer); 行并没有按照您的想法行事 - 那是您应该用来从 null 构造字符串的构造函数-终止的 C 字符串。您在这里处理的是二进制数据,因此您有可能没有将完整的缓冲区放入字符串中,因为它在缓冲区中间遇到空终止符,或者它超出了缓冲区的末尾直到找到空值(或段错误)。如果您绝对肯定必须使用 std::string,请使用“正确”的构造函数,即 std::string data(buffer, length);

总而言之,您使用了错误的数据结构 - 您想要的是动态的 char/unsigned char 数组。那将是一个 std::vector,而不是一个 std::string。另外,您还应该通过 const 引用将参数传递给 readFilewriteFile,您编写的代码将复制字符串,如果您传入的缓冲区writeFile() 很大,这将导致内存消耗和性能受到不愉快的影响,而且完全没有必要。

关于C++ zlib 压缩文件中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15091534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com