zlib inflation 在使用小缓冲区时损坏
zlib inflation corrupts when using small buffers
我需要用 zlib(大约 500 KiB)膨胀大字符串,我注意到当使用小缓冲区时输出被破坏(随机字母被转换成乱码)但是当切换到大缓冲区时输出不是已损坏。
这是我的代码:
std::string str;
std::lock_guard<std::mutex> lock(mutex_);
stream_.next_in = (unsigned char*)deflated.data();
stream_.avail_in = deflated.size();
int result = Z_OK;
do
{
char buffer[1024] = { 0 };
stream_.next_out = reinterpret_cast<unsigned char*>(buffer);
stream_.avail_out = sizeof(buffer);
result = ::inflate(&stream_, Z_NO_FLUSH);
str.append(buffer);
} while (result == Z_OK);
inflated = std::move(str);
现在在 1024 时,输出已损坏,但如果我将其切换为 256 KiB(字符缓冲区 [263168]),则输出正常。如何在不切换到这么大的缓冲区的情况下解决这个问题?
如果 inflate()
将所有 1024 个字节写入 char
数组,那么 char
数组将没有任何 NUL 终止符字节,因此当您执行 str.append(buffer)
,添加到 inflated
字符串中的将是数组中的 1024 个字符,加上数组后堆栈中恰好出现的任何垃圾字节,直到遇到第一个 NUL 字节。
我建议设置 stream._avail_out = sizeof(buffer)-1;
以避免该问题。
我需要用 zlib(大约 500 KiB)膨胀大字符串,我注意到当使用小缓冲区时输出被破坏(随机字母被转换成乱码)但是当切换到大缓冲区时输出不是已损坏。
这是我的代码:
std::string str;
std::lock_guard<std::mutex> lock(mutex_);
stream_.next_in = (unsigned char*)deflated.data();
stream_.avail_in = deflated.size();
int result = Z_OK;
do
{
char buffer[1024] = { 0 };
stream_.next_out = reinterpret_cast<unsigned char*>(buffer);
stream_.avail_out = sizeof(buffer);
result = ::inflate(&stream_, Z_NO_FLUSH);
str.append(buffer);
} while (result == Z_OK);
inflated = std::move(str);
现在在 1024 时,输出已损坏,但如果我将其切换为 256 KiB(字符缓冲区 [263168]),则输出正常。如何在不切换到这么大的缓冲区的情况下解决这个问题?
如果 inflate()
将所有 1024 个字节写入 char
数组,那么 char
数组将没有任何 NUL 终止符字节,因此当您执行 str.append(buffer)
,添加到 inflated
字符串中的将是数组中的 1024 个字符,加上数组后堆栈中恰好出现的任何垃圾字节,直到遇到第一个 NUL 字节。
我建议设置 stream._avail_out = sizeof(buffer)-1;
以避免该问题。