请教关于chunked的解码方法,望能人异士提供解码函数!小弟跪谢!(150)

  • 主题发起人 主题发起人 getmoney
  • 开始时间 开始时间
G

getmoney

Unregistered / Unconfirmed
GUEST, unregistred user!
GET后返回的数据如下:HTTP/1.1 200 OKDate: Tue, 20 Apr 2010 14:11:25 GMTServer: ApacheCache-Control: no-cacheExpires: Thu, 01 Jan 1970 00:00:00 GMTPragma: no-cacheConnection: closeTransfer-Encoding: chunkedContent-Type: text/html;charset=GBK250a ----------------> 被插入了这个字符HTML代码省略。。。。1ff8 ----------------> 被插入了这个字符HTML代码省略。。。。1ff8 ----------------> 被插入了这个字符HTML代码省略。。。。。。。省略--------------------------------------------------------------用Idhttp控件GET淘宝某页面后(用Winsock API自写的GET函数也如此),返回的数据中被插入了N个“1ff8”,据说表示返回数据的长度,1ff8=8184,在网络上查了下资料发现非常少,说是chunked编码导致的,请问谁能提供chunked的解码函数?好让返回的数据中不再出现“1ff8”!这个字符太烦了,把我要Pos定位的字符都给断开了!那位大大能提供个解码函数啊???????小弟在这里谢过了!
 
indy是支持的,楼主可以自己解出来
 
。。。我测试过的 不支持!
 
这个东西不需要解码,可以用文本搜索的方式直接去掉。下面代码当然不是完全按照你的要求写的,提供给你,仅供参考:/// Chunked 制造出来的文字前面带有连续 #D#A + #D#A 的标志function FindChunkedSign(Pspos:Pointer;var leave:int64):PLongword;begin Result := Pspos; while (Result^ <> $0A0D0A0D) do begin Result := Pointer(Integer(Result) + 1); Dec(leave, 1); if leave <= 0 then begin Result := nil; break; end; end;end;/// Chunked 制造出来的文字后面带有 #D#A 标志function CheckRS(S:int64; var spos:integer):Boolean;var i:integer;begin Result := False; for I := 0 to 7 do begin if Int64Rec(S).Bytes = $0D then begin if Int64Rec(S).Bytes[I + 1] = $0A then begin spos := I; Result := True; Break; end; end; end;end;/// 代码从这里开始procedure CleanupChunkedSign(Stream : TStream);var Rp:integer; Ppos:PLongword; I64, Rs:int64;begin if Stream.Size > 0 then begin with TMemoryStream.Create do begin LoadFromStream(Stream); Ppos := Memory; I64 := Size; Ppos := FindChunkedSign(Ppos, I64); while Ppos <> nil do begin Ppos := Pointer(Integer(Ppos) + 4); Rs := PInt64(Ppos)^; if CheckRS(Rs, Rp) then begin while Rp <> 0 do begin PByte(Ppos)^ := $20; Dec(Rp); Ppos := Pointer(Integer(Ppos) + 1); end; Ppos := Pointer(Integer(Ppos) + 4); Dec(I64, 8); end else Dec(I64, 4); Ppos := FindChunkedSign(Ppos, I64); end; Stream.Position := 0; SaveToStream(Stream); Free; end; end;end;/// 测试从这里开始!procedure TForm1.Button1Click(Sender: TObject);var fs:TFileStream;begin fs := TFileStream.Create('c:/ChunkedText.bin', fmOpenReadWrite); try fs.Position := 0; CleanupChunkedSign(fs); finally fs.Free; end;end;
 
不需要自己解码,IdHttp自动就帮你做好了。http://borland.newsgroups.archived.at/public.delphi.internet.winsock/200504/0504111836.html
 
我也想知道
 
to: xianjun请问IDHTTP需要怎么设置?请赐教,刚刚你发的那个英文帖子,我看不懂哈~ 我的英文水平有限。 谢谢!
 
Borland TeamB 的那个人已经说的很清楚了啊直接用GetStream方法就能取到完整的对方发过来的流数据,这个就是已经解码好的,不管传输过程中是用chunck还是什么编码格式。
 
难道没有效果?
 
淘宝什么网页采用了chunked方式?
 

Similar threads

回复
0
查看
861
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
后退
顶部