【发布时间】:2020-01-08 09:28:53
【问题描述】:
我正在尝试使用 zlib 解压缩 c 中的二进制缓冲区
BOOL gzipInflate(char* lpFileIn, DWORD lpFileInSize) {
z_stream strm;
char* uncomp, * uncomp2;
unsigned int uncompLength, half_length;
int err;
bool done = false;
uncompLength = lpFileInSize;
half_length = lpFileInSize / 2;
uncomp = (char*)calloc(sizeof(char), uncompLength);
memset(&strm, 0, sizeof(strm));
strm.next_in = (Bytef*)lpFileIn;
strm.avail_in = (uInt)lpFileInSize;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.total_out = Z_NULL;
if (inflateInit2(&strm, 16 + MAX_WBITS) != Z_OK) {
free(uncomp);
return FALSE;
}
while (!done)
{
if (strm.total_out >= uncompLength) {
uncomp2 = (char*)calloc(sizeof(char), uncompLength + half_length);
memcpy(uncomp2, uncomp, uncompLength);
uncompLength += half_length;
free(uncomp);
uncomp = uncomp2;
}
strm.next_out = (Bytef*)(uncomp + strm.total_out);
strm.avail_out = uncompLength - strm.total_out;
err = inflate(&strm, Z_SYNC_FLUSH);
if (err == Z_STREAM_END) {
done = true;
}
else if (err != Z_OK) {
break;
}
}
if (inflateEnd(&strm) != Z_OK) {
free(uncomp);
return FALSE;
}
free(uncomp);
return TRUE;
}
使用随机地址读取时出现访问冲突 我也使用 .NET 中的“GZipStream”来压缩缓冲区并使用 C 解压缩它
原始码:https://windrealm.org/tutorials/decompress-gzip-stream.php
【问题讨论】:
-
哪一行代码触发了访问冲突?在调试器中运行程序会立即告诉您这一点。然后您可以继续使用调试器来跟踪和检查代码。这是进行调试的最佳方式。如果您确实需要 Stackoverflow 的帮助,请提供minimal verifiable example。
-
膨胀(&strm, Z_SYNC_FLUSH);触发访问冲突
-
那么为什么不进入函数
inflate并更准确地查看它发生在哪里呢? -
@GuillaumePetitjean:很抱歉,这是一个个人项目,我在下班后试图通过套接字学习 gzlib,我几乎没有 1.5 或 2 个小时,而且我不太擅长 asm