HTTP gzip解压问题

祸起蛋炒饭 2016-07-11 11:53:22
我在网上调用的这个方法
int CMainDlg::httpgzdecompress(BYTE *zdata, ULONG nzdata, BYTE *data, ULONG *ndata)
{
int err = 0;
z_stream d_stream = {};
static char dummy_head[2] =
{
0x8 + 0x7 * 0x10,
(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
};

d_stream.zalloc = (alloc_func)0;
d_stream.zfree = (free_func)0;
d_stream.opaque = (voidpf)0;
d_stream.next_in = zdata;
d_stream.avail_in = 0;
d_stream.next_out = data;
if (inflateInit2(&d_stream, 47) != Z_OK) return -1;
while (d_stream.total_out < *ndata && d_stream.total_in < nzdata)
{
d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
if ((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END)
break;
if (err != Z_OK)
{
if (err == Z_DATA_ERROR)
{
d_stream.next_in = (Bytef*)dummy_head;
d_stream.avail_in = sizeof(dummy_head);
if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)
{
return -1;
}
}
else return -1;
}
}
if (inflateEnd(&d_stream) != Z_OK) return -1;
*ndata = d_stream.total_out;
if (d_stream.total_in != nzdata)
err = Z_BUF_ERROR;
return err;
}


然后 我是这么调用的
_variant_t varRspBody = pHttpReq->GetResponseBody(); 
ULONG dataLen = varRspBody.parray->rgsabound[0].cElements;
char *pContentBuffer = (char *)varRspBody.parray->pvData;
BYTE *btText = new BYTE[10000]();
ULONG ulLen = 10000;
httpgzdecompress((BYTE*)varRspBody.parray->pvData, dataLen, btText, &ulLen);
CString_Obj = (char*)btText;
delete btText;
为何最后显示的内容哦 显示不全 就是后面的全部显示为省略号了 我想获得全部的文本的话 应该怎么修改 求解决方案 谢谢
...全文
465 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
祸起蛋炒饭 2017-06-07
  • 打赏
  • 举报
回复
int CMainDlg::httpgzdecompress(BYTE *zdata, ULONG nzdata, BYTE *data, ULONG *ndata, CString &strBody)
{
	int err = 0;
	z_stream d_stream = {};
	static char dummy_head[2] =
	{
		0x8 + 0x7 * 0x10,
		(((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
	};

	d_stream.zalloc = (alloc_func)0;
	d_stream.zfree = (free_func)0;
	d_stream.opaque = (voidpf)0;
	d_stream.next_in = zdata;
	d_stream.avail_in = 0;
	d_stream.avail_out = 0;
	d_stream.next_out = data;
	if (inflateInit2(&d_stream, 47) != Z_OK) return -1;
	while (d_stream.total_out < *ndata && d_stream.total_in < nzdata)
	{
		d_stream.avail_in = d_stream.avail_out = 1; // force small buffers 
		if ((err = inflate(&d_stream, Z_NO_FLUSH)) == Z_STREAM_END)
			break;
		if (err != Z_OK)
		{
			if (err == Z_DATA_ERROR)
			{
				d_stream.next_in = (Bytef*)dummy_head;
				d_stream.avail_in = sizeof(dummy_head);
				if ((err = inflate(&d_stream, Z_NO_FLUSH)) != Z_OK)
				{
					return -1;
				}
			}
			else return -1;
		}
	}
	if (inflateEnd(&d_stream) != Z_OK) return -1;

	*ndata = d_stream.total_out;
	CString strTemp(data);
	ConvertUtf8ToGBK(strTemp);
	strBody = strTemp;
	if (d_stream.total_in != nzdata)
		err = Z_BUF_ERROR;
	return err;
}
祸起蛋炒饭 2016-07-13
  • 打赏
  • 举报
回复
我已经搞好了 之后还需要在转一下码 就能好了
encoderlee 2016-07-13
  • 打赏
  • 举报
回复
可以尝试取ResponseText而不要取ResponseBody看看。 gzip解压这种事情应该是由http库来完成的,这种事情都要自己来实现,那么未免太麻烦了。 所以还是仔细看一看文档,看看你用的这个http库能不能自动gzip解压。 WinHttp是可以自动处理gzip压缩的,我用WinHttp的C API一直都没有遇到过gzip解压问题。 你用的好像是WinHttp的COM接口,这个接口我没用过,不太清楚。
赵4老师 2016-07-12
  • 打赏
  • 举报
回复
10000太小。
祸起蛋炒饭 2016-07-12
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
10000太小。
我刚调试 跟这个值就没有关系

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧