HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
1030
pozonhttpメッセージボディのgzip圧縮をデコードしたい。4解決


pozon

リンク

2010/10/30(Sat) 07:29:01|NO.35548

サイトから送信されてきたgzip圧縮されたメッセージボディを
デコードする方法がわからず途方にくれています。

例では2ch.netを挙げています。
サイトによっては強制的にgzipで送信してくる所もあるので
ヘッダに「Accept-Encoding: none」を指定する手が使えないこともありました。

テストコードではgzip圧縮されたメッセージボディ部の取得ができます。
よろしくお願いします。


//http://hsp.tv/play/pforum.php?mode=pastwch&num=23799より改造しました #include "hspinet.as" #include "hspsock.as" screen 0, 600,800 sdim hLog,1024000 pos 0,0 mesbox hLog,600,800,0 hLogId=stat //初期化 netinit:if stat!=0:dialog "err.":end //接続 sockopen 0,"2ch.net",80 //エラー時 if stat : dialog "sock err. ["+stat+"]":end //ヘッダ header="GET http://2ch.net/ HTTP/1.1\n" header+="Host: 2ch.net\n" header+="Cache-Control: max-age=0\n" //gzipを許可 header+="Accept-Encoding: gzip,deflate\n\n" hLog+=header:objprm hLogId,hLog;mesbox更新 //ヘッダを投げる sockput header if stat!=0:dialog "send err. ["+stat+"]":end buf="":a="" b=0:sz=0 *wloop await 0 sockget a,64 if stat : dialog "socket error" : end b=peek(a,0):if b=0 : goto *sdok buf+=a sz+=64 if sz>30000 : dialog "受信サイズがオーバーしました。" : goto *sdok goto *wloop *sdok hLog+=buf+"\n\n":objprm hLogId,hLog;mesbox更新 //行ごとに分解 split buf,"\n",httpDat //空行の次がメッセージボディ位置 empLineNum=0 repeat length(httpDat) if httpDat.cnt="":empLineNum=cnt:break loop httpMessageBody=httpDat.(empLineNum+1) hLog+="httpMessageBody\n"+httpMessageBody+"\n\n":objprm hLogId,hLog;mesbox更新 //おわり stop



この記事に返信する


pozon

リンク

2010/10/30(Sat) 07:31:29|NO.35549

zlib 汎用データ圧縮
http://taillove.jp/mia/plugin/arc/z.txt
http://taillove.jp/mia/plugin/arc/z.lzh
こちらのプラグインが使えると思い、下記のようなコードを
上記コードの後部に追加したのですが結果が000000...となり処理できませんでした。

#include "z.as"

datasize=strlen(httpMessageBody)
dim cdata, datasize
dim udata, datasize

repeat datasize
getstr cdata.cnt,httpMessageBody,cnt,,1
loop
cJoin="":repeat length(cdata):cJoin+=cdata.cnt:loop
hLog+="compressData\n"+cJoin+"\n\n":objprm hLogId,hLog;mesbox更新

zSetDest udata, datasize

zUncompress cdata, datasize

uJoin="":repeat length(udata):uJoin+=udata.cnt:loop
hLog+="unCompressedData\n"+uJoin+"\n\n":objprm hLogId,hLog;mesbox更新

//おわり
stop



ORZ

リンク

2010/10/30(Sat) 09:56:17|NO.35553

まったく試しておりませぬが
http://www.csdinc.co.jp/archiver/dev/main.html
ここにあるLhspを使ってTAR32.DLLに投げてみる、っていうのは出来ないっすかね。



pozon

リンク

2010/11/2(Tue) 12:10:07|NO.35638

>>ORZさん
ありがとうございます。

前述のz.asと教えていただいたLhsp、それとTAR32.DLLをなんとか使ってみて、
ローカル上での文字列の圧縮→展開はなんとかできるようになりました。

しかし、これらの圧縮機能で生成されるバイナリと、httpで送られてくるバイナリが
微妙に違うみたいで、httpで送られてくるgzipバイナリの展開はできずじまい。
http受信のものは前頭の1F8B〜のあとすぐに数値があって、ローカル上で作成したバイナリは1F8B000000〜みたいな感じでした。

しかしgzip仕様もよくわからず雲をつかむような感じなので断念することにしました。
ありがとうございました。



damage

リンク

2010/11/2(Tue) 13:12:41|NO.35639

?gzipのライブラリ使ってデコードすりゃいいんじゃね?



ONION software Copyright 1997-2023(c) All rights reserved.