GZIP解压缩的问题,我用的是ZLIP,但总是报DATA ERROR的错误 我用这个VCLZIP.v3.06.2没有问题。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我下载了这个控件,调用的是 ZLibDecompressString这个函数,但是还是报错,会不会是我的数据格式有问题 不知道咱们用的是不是一个东东我是uses lvkZLibUtils;mHtmlText := mHttp.Get(murl);if mHttp.Response.ContentEncoding = 'gzip' then mHtmlText := gZipDeCompress(mHtmlText); 我是用internetreadfile获取源码的,试过用IDHTTP获取GZIP格式后能成功解压,而用自己写的函数却提示data error,现贴出源码,请大家帮忙看看是什么问题function HttpGetString(mUrl , mReferer: string ; var mStringResult : string; mMethod : string;bGzip : boolean) : boolean;var hSession, hConnect, hRequest: hInternet; HostName, FileName, mData: String; f: File; Buf: Pointer; dwBufLen, dwIndex: DWord; Data: Array[0..1024] of Char;//Array[0..$400] of Char; TempStr: String; RequestMethod: PChar; InternetFlag: DWord; AcceptType: LPStr; mResult : boolean; mFileSize : integer; mBinaryData : boolean; BytesToRead, BytesReaded: DWord; p : integer; procedure ParseURL(URL: String; var HostName, FileName: String); //取得精确的服务器名字,和地址文件 //HTTP://<IP 地址>/[端口号]/[路径][?<查询信息>] procedure ReplaceChar(c1, c2: Char; var St: String); var p : Integer; begin while True do begin p := Pos(c1, St); if p = 0 then break else St[p] := c2; end; end; var i : Integer; begin if Pos('http://', LowerCase(URL)) <> 0 then System.Delete(URL, 1, 7); i := Pos('/', URL); HostName := Copy(URL, 1, i); FileName := Copy(URL, i, Length(URL) - i + 1); if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then SetLength(HostName, Length(HostName) - 1); end; procedure CloseHandles; //5, 最后依次关闭request,connect,session句柄 begin InternetCloseHandle(hRequest); InternetCloseHandle(hConnect); InternetCloseHandle(hSession); end; begin try ParseURL(mUrl, HostName, FileName); //showmessage(HostName + ' ' + FileName); hSession := InternetOpen(PChar('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C)'), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0); hConnect := InternetConnect(hSession, PChar(HostName), INTERNET_DEFAULT_HTTP_PORT, PChar(''), PChar(''), INTERNET_SERVICE_HTTP, 0, 0); RequestMethod := PChar(mMethod);//('GET'); // InternetFlag := INTERNET_FLAG_RELOAD;//0; //是否取用缓存 InternetFlag := INTERNET_FLAG_RELOAD; AcceptType := PChar('*/*'); //接受类型 //3, 然后我们使用这个connect句柄来打开Http 请求得到一个HINTERNET request句柄; hRequest := HttpOpenRequest(hConnect, //通过InternetConnect()函数调用返回的HINTERNET类型的句柄 RequestMethod, //该参数是一个指向包含请求所使用的动词的字符串,如果为NULL,那么表示的是GET请求,可以选择有: //GET:接收服务器发送的数据 //POST:向服务器发送执行的操作 //HEAD:接收服务器对请求的响应标题 //DELETE:删除服务器上的一个资源 //PUT:为服务器发送存储信息 //LINK:在URL之间建立连接 PChar(FileName), //表示操作的对象,一般情况下为一个要接收的文件的文件名 'HTTP/1.1', //表示所使用的HTTP协议版本。NULL值表示HTTP/1.0 PChar(mReferer), //表示页的URL,lpszObjectName指定的信息存放在这个地址中 @AcceptType, //指定客户端可接受的信息类型。NULL则视为接收“text/*”类型,即文本类型 InternetFlag, //给出调用该函数的其他选项 0); //为异步I/O设置环境 //HttpAddRequestHeaders(hRequest, 'Accept-Language: zh-cn',length('Accept-Language: zh-cn'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE); HttpAddRequestHeaders(hRequest, 'Connection: Keep-Alive',length('Connection: Keep-Alive'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE); //HttpAddRequestHeaders(hRequest, 'Content-Type: application/x-www-form-urlencoded;charset=utf-8',length('Content-Type: application/x-www-form-urlencoded;charset=utf-8'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE); if bGZip = True then HttpAddRequestHeaders(hRequest, 'Accept-Encoding: gzip, deflate',length('Accept-Encoding: gzip, deflate'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE); HttpAddRequestHeaders(hRequest, 'x-requested-with: XMLHttpRequest',length('x-requested-with: XMLHttpRequest'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE); //Content-Type //4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据;//gzip, deflate HttpSendRequest(hRequest, //是HttpOpenRequest()函数调用返回的句柄 nil, //此参数用来指定发送时附加的头,这个标题和请求一起被发送 0, //标题的长度 nil, //指向待发送的数据 0); //待发送数据的长度 dwIndex := 0; dwBufLen := 1024; GetMem(Buf, dwBufLen); //获取服务器对请求的响应信息 mResult := HttpQueryInfo(hRequest, //是HttpOpenRequest()函数调用返回的句柄 HTTP_QUERY_RAW_HEADERS_CRLF,//HTTP_QUERY_CONTENT_LENGTH, //指定返回信息及返回的方式 (返回文件的大小) Buf, //存放返回信息(指针) dwBufLen, //返回信息的长度 dwIndex); //存放下一个匹配的标题索引值,如果找不到匹配的标题,那么此值将返回:ERROR_HTTP_HEADER_NOT_FOUND Form1.Memo3.Lines.Add(PChar(Buf)); mData := PChar(Buf); p := pos('X-Last-Serial:',mData); if p <> 0 then begin system.Delete(mData,1,p+length('X-Last-Serial:')-1); pos('Content-Type:',mData); mData := Trim(copy(mData,1,pos('Content-Type:',mData)-1)); s_A_SerialID := mData; end; mResult := HttpQueryInfo(hRequest, //是HttpOpenRequest()函数调用返回的句柄 HTTP_QUERY_CONTENT_LENGTH, //指定返回信息及返回的方式 (返回文件的大小) Buf, //存放返回信息(指针) dwBufLen, //返回信息的长度 dwIndex); mBinaryData := false; if mResult or not mBinaryData then begin //mFileSize := StrToInt(StrPas(Buf)); //把文件长度付给FTFileSize 无用? BytesReaded := 0; mStringResult := ''; //Form1.Memo3.Lines.Add('********************'); while True do //死循环,不断读取网络文件数据 begin BytesToRead := 1024; //Form1.Memo3.Lines.Add('********ReadFile********'); if not InternetReadFile(hRequest,@Data,1024,BytesToRead) then begin mResult := False; Break; //如果网络读取字节流不成功,则退出循环 end else begin //Form1.Memo3.Lines.Add('********EndFile********'); if BytesToRead = 0 then begin mResult := False; Break; //如果读取数据为0,则跳出循环 end else begin TempStr := Data; SetLength(TempStr,BytesToRead); mStringResult := mStringResult + TempStr; inc(BytesReaded,BytesToRead); //保存已经读取的总字节数 //Form1.Memo3.Lines.Add(FloatToStr(BytesToRead)+' '+FloatToStr(BytesReaded)); end; end; end; SetLength(mStringResult, BytesReaded); //设置变量FTStringResult大小, mResult := BytesReaded <> 0; //保存结果 end; //Form1.Memo3.Lines.Add('********END********'); Result := mResult; FreeMem(Buf); //释放内存 CloseHandles; except mResult := false; Result := mResult; //Form1.Memo3.Lines.Add(mUrl + '出错了'); end; end; uses IdZLibCompressorBase,IdCompressorZLib;type IdCompressorZLib1: TIdCompressorZLib;过程中加入RS1 := TStringstream.Create('', 936); IdHTTP1.Request.AcceptEncoding := 'identity';..然后直接对RS1赋值即可 delphi xe5 成功解决 TpagecontrolEx 一个你调试不到的错误; 怎么在我的程序启动时候调用ini文件中的有关内容!(如下) 我想在登陆窗口实现自动登陆该怎么办 有没有一起创业的 WebBrowser窗口关闭的问题。。。 问:那儿《有高效率数据库应用系统篇》这本书的电子版本?在那儿下载?谢谢,50答谢:) 如何屏蔽flash控件的菜单? 有一个日期型字段(是paradox)数据库,怎样将年和月分别转换为数值呢? ICS控件组的Ping控件在哪里找?????自带的么?我真的找不到哦??? 在没有标题栏的窗体中,怎样移动窗体? delphi如何点击网页中的复选框 delphi 读取pdf 文档的属性
我下载了这个控件,调用的是 ZLibDecompressString这个函数,但是还是报错,会不会是我的数据格式
有问题
我是uses lvkZLibUtils;mHtmlText := mHttp.Get(murl);
if mHttp.Response.ContentEncoding = 'gzip' then
mHtmlText := gZipDeCompress(mHtmlText);
我是用internetreadfile获取源码的,试过用IDHTTP获取GZIP格式后能成功解压,而用自己写的
函数却提示data error,现贴出源码,请大家帮忙看看是什么问题function HttpGetString(mUrl , mReferer: string ; var mStringResult : string; mMethod : string;bGzip : boolean) : boolean;
var
hSession, hConnect, hRequest: hInternet;
HostName, FileName, mData: String;
f: File;
Buf: Pointer;
dwBufLen, dwIndex: DWord;
Data: Array[0..1024] of Char;//Array[0..$400] of Char;
TempStr: String;
RequestMethod: PChar;
InternetFlag: DWord;
AcceptType: LPStr;
mResult : boolean;
mFileSize : integer;
mBinaryData : boolean;
BytesToRead, BytesReaded: DWord;
p : integer; procedure ParseURL(URL: String; var HostName, FileName: String); //取得精确的服务器名字,和地址文件
//HTTP://<IP 地址>/[端口号]/[路径][?<查询信息>]
procedure ReplaceChar(c1, c2: Char; var St: String);
var
p : Integer;
begin
while True do
begin
p := Pos(c1, St);
if p = 0 then
break
else
St[p] := c2;
end;
end; var
i : Integer;
begin
if Pos('http://', LowerCase(URL)) <> 0 then
System.Delete(URL, 1, 7);
i := Pos('/', URL);
HostName := Copy(URL, 1, i);
FileName := Copy(URL, i, Length(URL) - i + 1); if (Length(HostName) > 0) and (HostName[Length(HostName)] = '/') then
SetLength(HostName, Length(HostName) - 1);
end; procedure CloseHandles; //5, 最后依次关闭request,connect,session句柄
begin
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hSession);
end; begin
try
ParseURL(mUrl, HostName, FileName);
//showmessage(HostName + ' ' + FileName);
hSession := InternetOpen(PChar('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET4.0C)'), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
hConnect := InternetConnect(hSession, PChar(HostName), INTERNET_DEFAULT_HTTP_PORT, PChar(''), PChar(''), INTERNET_SERVICE_HTTP, 0, 0);
RequestMethod := PChar(mMethod);//('GET'); //
InternetFlag := INTERNET_FLAG_RELOAD;//0; //是否取用缓存 InternetFlag := INTERNET_FLAG_RELOAD;
AcceptType := PChar('*/*'); //接受类型
//3, 然后我们使用这个connect句柄来打开Http 请求得到一个HINTERNET request句柄;
hRequest := HttpOpenRequest(hConnect, //通过InternetConnect()函数调用返回的HINTERNET类型的句柄
RequestMethod, //该参数是一个指向包含请求所使用的动词的字符串,如果为NULL,那么表示的是GET请求,可以选择有:
//GET:接收服务器发送的数据
//POST:向服务器发送执行的操作
//HEAD:接收服务器对请求的响应标题
//DELETE:删除服务器上的一个资源
//PUT:为服务器发送存储信息
//LINK:在URL之间建立连接
PChar(FileName), //表示操作的对象,一般情况下为一个要接收的文件的文件名
'HTTP/1.1', //表示所使用的HTTP协议版本。NULL值表示HTTP/1.0
PChar(mReferer), //表示页的URL,lpszObjectName指定的信息存放在这个地址中
@AcceptType, //指定客户端可接受的信息类型。NULL则视为接收“text/*”类型,即文本类型
InternetFlag, //给出调用该函数的其他选项
0); //为异步I/O设置环境
//HttpAddRequestHeaders(hRequest, 'Accept-Language: zh-cn',length('Accept-Language: zh-cn'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
HttpAddRequestHeaders(hRequest, 'Connection: Keep-Alive',length('Connection: Keep-Alive'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
//HttpAddRequestHeaders(hRequest, 'Content-Type: application/x-www-form-urlencoded;charset=utf-8',length('Content-Type: application/x-www-form-urlencoded;charset=utf-8'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
if bGZip = True then
HttpAddRequestHeaders(hRequest, 'Accept-Encoding: gzip, deflate',length('Accept-Encoding: gzip, deflate'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
HttpAddRequestHeaders(hRequest, 'x-requested-with: XMLHttpRequest',length('x-requested-with: XMLHttpRequest'), HTTP_ADDREQ_FLAG_ADD or HTTP_ADDREQ_FLAG_REPLACE);
//Content-Type
//4, 这时我们就可以使用这个request句柄来发送数据与读取从服务器返回的数据;//gzip, deflate
HttpSendRequest(hRequest, //是HttpOpenRequest()函数调用返回的句柄
nil, //此参数用来指定发送时附加的头,这个标题和请求一起被发送
0, //标题的长度
nil, //指向待发送的数据
0); //待发送数据的长度 dwIndex := 0;
dwBufLen := 1024;
GetMem(Buf, dwBufLen);
//获取服务器对请求的响应信息
mResult := HttpQueryInfo(hRequest, //是HttpOpenRequest()函数调用返回的句柄
HTTP_QUERY_RAW_HEADERS_CRLF,//HTTP_QUERY_CONTENT_LENGTH, //指定返回信息及返回的方式 (返回文件的大小)
Buf, //存放返回信息(指针)
dwBufLen, //返回信息的长度
dwIndex); //存放下一个匹配的标题索引值,如果找不到匹配的标题,那么此值将返回:ERROR_HTTP_HEADER_NOT_FOUND
Form1.Memo3.Lines.Add(PChar(Buf));
mData := PChar(Buf);
p := pos('X-Last-Serial:',mData);
if p <> 0 then
begin
system.Delete(mData,1,p+length('X-Last-Serial:')-1);
pos('Content-Type:',mData);
mData := Trim(copy(mData,1,pos('Content-Type:',mData)-1));
s_A_SerialID := mData;
end;
mResult := HttpQueryInfo(hRequest, //是HttpOpenRequest()函数调用返回的句柄
HTTP_QUERY_CONTENT_LENGTH, //指定返回信息及返回的方式 (返回文件的大小)
Buf, //存放返回信息(指针)
dwBufLen, //返回信息的长度
dwIndex);
mBinaryData := false;
if mResult or not mBinaryData then
begin
//mFileSize := StrToInt(StrPas(Buf)); //把文件长度付给FTFileSize 无用?
BytesReaded := 0;
mStringResult := '';
//Form1.Memo3.Lines.Add('********************');
while True do //死循环,不断读取网络文件数据
begin
BytesToRead := 1024;
//Form1.Memo3.Lines.Add('********ReadFile********');
if not InternetReadFile(hRequest,@Data,1024,BytesToRead) then
begin
mResult := False;
Break; //如果网络读取字节流不成功,则退出循环
end
else
begin
//Form1.Memo3.Lines.Add('********EndFile********');
if BytesToRead = 0 then
begin
mResult := False;
Break; //如果读取数据为0,则跳出循环
end
else
begin
TempStr := Data;
SetLength(TempStr,BytesToRead);
mStringResult := mStringResult + TempStr;
inc(BytesReaded,BytesToRead); //保存已经读取的总字节数
//Form1.Memo3.Lines.Add(FloatToStr(BytesToRead)+' '+FloatToStr(BytesReaded));
end;
end;
end;
SetLength(mStringResult, BytesReaded); //设置变量FTStringResult大小,
mResult := BytesReaded <> 0; //保存结果
end;
//Form1.Memo3.Lines.Add('********END********');
Result := mResult;
FreeMem(Buf); //释放内存
CloseHandles;
except
mResult := false;
Result := mResult;
//Form1.Memo3.Lines.Add(mUrl + '出错了');
end;
end;
type IdCompressorZLib1: TIdCompressorZLib;
过程中加入
RS1 := TStringstream.Create('', 936);
IdHTTP1.Request.AcceptEncoding := 'identity';
..然后直接对RS1赋值即可 delphi xe5 成功解决