锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浠?/span>HTTP鐨勮搴?/span>
1 瀹㈡埛绔?/span> 鍦?/span>http Request Header涓婂甫涓?/span> Accept-Encoding:gzip,deflate
2鏈嶅姟鍣ㄨ嫢鏄敮鎸?/span>gzip鍘嬬緝鍒欏湪http reponse eader
閮ㄥ垎榪斿洖Content-Encoding: gzip 鎴栬?/span>Content-Type: application/x-gzip
3灝?/span>body閮ㄥ垎鐢?/span>gzip瑙e帇緙?/span> 鍒欏緱鍒扮綉欏靛唴瀹?/span>.
浼犺涓?/span>ie鏈?/span>bug 鍦ㄥ鐞?/span>js css鍘嬬緝鐨勬椂鍊欐湁bug,鎴戜笉鐞嗚В 鎸虹畝鍗曠殑鎬庝箞浼?xì)鏈?/span>bug鍛?/span>.
浠?/span>gzip鐨勮搴?/span>
gzip鏄竴縐嶆暟鎹牸寮?/span> 榛樿涓旂洰鍓嶄粎浣跨敤deflate綆楁硶鍘嬬緝data閮ㄥ垎
zlib涔熸槸涓縐嶆暟鎹牸寮?/span>,浣跨敤defalte綆楁硶鍘嬬緝鏁版嵁閮ㄥ垎.
deflate鏄竴縐嶅帇緙╃畻娉?/span>,鏄?/span>huffman緙栫爜鐨勪竴縐嶅姞寮?/span>
zlib鏄竴涓紑婧愬簱, 鎻愪緵deflate鍘嬬緝鍜屽搴旂殑infalte瑙e帇緙?/span>.
涓嶈繃zlib榛樿鐨?/span>deflate infalte榛樿鏄鐞?/span>zlib鏍煎紡鏁版嵁.蹇呴』浣跨敤
deflateInit2(&strm, DEFAULT_COMPRESSION,Z_DEFLATED, DEFAULT_WINDOWSIZE,DEFAULT_MEMLEVEL, Z_DEFAULT_STRATEGY);
鍒濆鍖栨墠鏄鐞?/span>raw deflate data.(榪欎竴鐐瑰湪zlib manul娌℃湁鎻?/span>,鍦?/span>faq涓彁鍒?/span>,鍥版壈浜嗘垜濂戒箙,榪樻槸鍚屼簨L甯垜璋冭瘯鍙戠幇)
鑷充簬gzip鏍煎紡瑙f瀽 瀵圭潃RFC鍐欏氨鍙互浜?/span>.
鍙傝RFC 1950 鍏充簬zlib http://www.faqs.org/rfcs/rfc1950.html
RFC 1951 鍏充簬deflate http://www.faqs.org/rfcs/rfc1951.html
RFC 1952 鍏充簬gzip http://www.faqs.org/rfcs/rfc1952.html
nt CGzip::Ungzip(const std::string & inStr , std::string &outStr){
static int nFileCount=0;
nFileCount++;
string strZipFileName="test";
// CConvert::StrToFile(inStr,strZipFileName+CConvert::toString<int>(nFileCount)+"H.gzip"
;
if(inStr.length()<11){
return -1;
}
//process gzip header
unsigned int skipCt = 10;
unsigned int skipZeroCt = 0;
unsigned char ID1 = inStr[0];
unsigned char ID2 = inStr[1];
unsigned char XFL=inStr[8];
bool bFEXTRA = false ;
bool bFNAME = false ;
bool bFCOMMENT = false ;
bool bFHCRC = false ;
unsigned int XLEN = 0;
if( (ID1!=31) && (ID2!=139)){
return -1; //闈?/span>gzip澶撮儴
}
unsigned char CM = inStr[2];
if(CM!=
{
return -1; //鐜板湪閮藉彧澶勭悊 deflate鍘嬬緝鐨?/span>
}
unsigned char FLG = inStr[3];
if( (FLG & GZIP_HEAD_FEXTRA) != 0){
bFEXTRA = true ;
skipCt += 2;
XLEN = inStr[10]+ inStr[11]*256 ;//鎸夌収灝忕瀛楄妭搴忓垪澶勭悊
skipCt += XLEN;
}
if( (FLG & GZIP_HEAD_FNAME) != 0){
bFNAME = true;
skipZeroCt++;
}
if( (FLG & GZIP_HEAD_FCOMMENT) != 0){
bFCOMMENT = true;
skipZeroCt++;
}
size_t passedZeroCt = 0;
size_t iStep = skipCt ;
for( size_t iStep = skipCt ; iStep<inStr.length(); iStep++){
if(passedZeroCt>=skipZeroCt){
break;
}
if(inStr[iStep]==''
{
passedZeroCt++;
}
}
skipCt = iStep ;
if( (FLG & GZIP_HEAD_FHCRC) != 0){
bFHCRC = true;
skipCt+=2 ;
}
string coreStr = inStr.substr(skipCt,inStr.length()-8-skipCt);
return CGzip::Inflate(coreStr,outStr);
}
int CGzip:
ogzip(const std::string & inStr , std::string &outStr){
char pAddHead[10];
unsigned long crc = 0;
// gzip header
static const char deflate_magic[2] = {'37', '\213'};
snprintf(pAddHead, 10,
"%c%c%c%c%c%c%c%c%c%c", deflate_magic[0],
deflate_magic[1], Z_DEFLATED, 0 /* flags */,
0, 0, 0, 0 /* 4 chars for mtime */,
0 /* xflags */, 0xff);
string addHead(pAddHead,10);
//gzip's raw deflate body
if(CGzip:
eflate(inStr,outStr)<0){
return - 1;
}
//gzip trailer
crc = crc32(crc, (const Bytef*)inStr.data(), inStr.length());
char tailBuf[8];
memcpy(tailBuf, &crc, 4);
int isize=inStr.size();
memcpy(tailBuf,&isize,4);
string tailStr(tailBuf , 8 );
outStr = addHead + outStr+tailStr; //
return outStr.length(); //
銆銆浠ュ墠鐢℅reta錛屼絾鎬庝箞閮借寰椾笉鐖斤紝鐗瑰埆鏄敤鎯簡PHP鐨勬垜錛岀敤鐫POSIX鐨勬鍒欒〃杈懼紡寰堜笉涔?fàn)鎯?
銆銆浜庢槸浠婂ぉ鐞㈢(浜嗕笅Pcre錛岃繖涓彿縐版渶寮哄ぇ鐨勬鍒欒〃杈懼紡搴撯︹?
銆銆涓嶈繃錛屾瘮璧稧reta鏈閮侀椃鐨勫氨鏄紪璇慞cre浜嗏︹?
銆銆鍦ㄧ綉涓婃壘浜嗕竴孌靛疄鍦ㄤ笉鎬庝箞鏈夌敤錛屽眳鐒惰鐢ㄥ埌mv.exe錛學(xué)indows XP涓嬩笂鍝壘鍘伙紵
銆銆鑳界敤rename涓轟粈涔堣鐢╩v.exe錛?
銆銆鎶婇偅孌電紪璇戣剼鏈滃己鏀光濅互鍚庯紝灝辨垚浜嗕笅闈㈢殑鏍峰瓙浜嗏︹?
銆銆褰撶劧浣犺繕鏄緱鏈塻ed.exe
銆銆濡傛灉娌℃湁璇風(fēng)偣姝や笅杞?sed.exe
銆銆鐒跺悗鎶妔ed.exe鏀懼埌pcre婧愮爜鐩綍涓嬶紝鎶婁笅闈㈢殑鏂囧瓧淇濆瓨涓簃ake.bat錛岀敤cmd榪涘叆pcre鐩綍錛岃繍琛宮ake鍗沖彲銆?
@echo off
echo 姝e湪棰勫鐞?..
echo ------------------------------------------
copy /y config.h.generic bak.h.generic
sed -e "s/#define HAVE_BCOPY 1/#define HAVE_BCOPY 0/g" config.h.generic > config.h
copy /y pcre.h.generic pcre.h
copy /y pcre_chartables.c.dist pcre_chartables.c
echo ------------------------------------------
echo 姝e湪緙栬瘧 dftables.exe ...
echo ------------------------------------------
cl -MD -DHAVE_CONFIG_H dftables.c
dftables.exe pcre_chartables.c
echo ------------------------------------------
echo 姝e湪緙栬瘧婧愪唬鐮佷負(fù)Obj鏂囦歡...
echo ------------------------------------------
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_chartables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_compile.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_config.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_dfa_exec.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_exec.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_fullinfo.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_get.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_globals.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_info.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_maketables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_newline.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_ord2utf8.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_refcount.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_study.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_tables.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_try_flipped.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_ucp_searchfuncs.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_valid_utf8.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_version.c
cl -O1 -MD -DHAVE_CONFIG_H -c pcre_xclass.c
echo ------------------------------------------
echo 姝e湪鐢熸垚Lib鏂囦歡...
echo ------------------------------------------
lib -out:pcre.lib pcre_chartables.obj pcre_compile.obj pcre_config.obj pcre_dfa_exec.obj pcre_exec.obj pcre_fullinfo.obj pcre_get.obj pcre_globals.obj pcre_info.obj pcre_maketables.obj pcre_newline.obj pcre_ord2utf8.obj pcre_refcount.obj pcre_study.obj pcre_tables.obj pcre_try_flipped.obj pcre_ucp_searchfuncs.obj pcre_valid_utf8.obj pcre_version.obj pcre_xclass.obj
echo ------------------------------------------
echo 姝e湪榪樺師...
echo ------------------------------------------
copy /y bak.h.generic config.h.generic
echo ------------------------------------------
echo 姝e湪娓呯悊...
del *.obj
del dftables.exe
del bak.h.generic
del config.h
del dftables.lib
del dftables.exp
del pcre_chartables.c
echo ------------------------------------------
echo 瀹屾垚
echo 鏈緇堢敓鎴愬垪琛細(xì)
echo - pcre.lib
echo - pcre.h
echo ------------------------------------------
pause
@echo on
銆銆鏈鍚庣敓鎴恜cre.lib鍜宲cre.h涓や釜鏂囦歡銆?/p>
閫夋嫨Win32 LIB Release 鎸塅7緙栫粠鐢熸垚zlib.lib
宸ョ▼涓嬌鐢ㄦ椂鎶?
D:\zlib-1.2.3\projects\visualc6\Win32_LIB_Release\zlib.lib
D:\zlib-1.2.3\zlib.h
D:\zlib-1.2.3\zconf.h
鎷瘋礉鍒版墍鍦ㄥ伐紼嬬洰褰曚笅
鐒跺悗
#include "zlib.h"
#pragma comment(lib,"zlib.lib")
void CZlibTestDlg::OnButton1()
{
const unsigned char strSrc[]="hello world!\n\
aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd涓枃嫻嬭瘯 涓枃嫻嬭瘯\
aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd涓枃嫻嬭瘯 涓枃嫻嬭瘯\
aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd涓枃嫻嬭瘯 涓枃嫻嬭瘯\
aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd涓枃嫻嬭瘯 涓枃嫻嬭瘯";
unsigned char buff[1024]={0},strDst[1024]={0};
unsigned long srcLen=sizeof(strSrc),bufLen=sizeof(buff),dstLen=sizeof(strDst);
CString strc,strc2,strc3;
strc.Format("Src string:%s\nLength:%d\n===================\n",strSrc,srcLen);
//鍘嬬緝
compress(buff,&bufLen,strSrc,srcLen);
strc2.Format("\nAfter Compressed Length:%d\nCompressed String:%s\n==============\n",bufLen,buff);
//瑙e帇緙?br> uncompress(strDst,&dstLen,buff,bufLen);
strc3.Format("\nAfter UnCompressed Length:%d\nUnCompressed String:%s\n",dstLen,strDst);
AfxMessageBox(strc+strc2+strc3);
}
浠婂ぉ鐪嬩簡涓涓嬪浣曚嬌鐢≒CRE錛岃繕娌℃湁娑夊強(qiáng)鍒癙CRE鍘熺悊鍜屽疄鐜扮殑浠g爜銆傛垜浠彲浠ュ湪http://www.pcre.org/涓婁笅杞藉埌pcre鐨勪唬鐮侊紝涓嬭澆鍒扮殑婧愭枃浠秔cre-x.x.tar.bz2鍦╨inux涓嬮潰寰堝鏄撳氨鍙互琚紪璇戝拰瀹夎(x86 緋誨垪cpu鍝?銆?
./configure
make
make install
PCRE緙栬瘧瀹夎涔嬪悗錛屼互涓涓猯ib搴撶殑鏂瑰紡鎻愪緵緇欑敤鎴風(fēng)▼搴忚繘琛屼嬌鐢紝PCRE lib 鎻愪緵浜嗕竴緇凙PI,閫氳繃榪欎竴緇凙PI鍙互瀹炵幇綾諱技浜嶱erl璇硶鐨勬鍒欒〃杈懼紡鏌ユ壘鍜屽尮閰嶇殑鍔熻兘銆傦紙PCREE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl, with just a few differences.錛?
瑕佹兂浣跨敤濂絇CRE錛岃浜嗚В寰堝姝e垯琛ㄨ揪寮忕殑鍐呭銆佸悓鏃墮渶瑕佸PCRE榪涜寰堝鐨勯厤緗紝浠庤屼嬌鍏舵敮鎸佷笉鍚岀殑妯″紡鍜岃鏍箋傚湪榪欓噷鍙槸綆鍗曠殑鎻忚堪涓涓嬩嬌鐢≒CRE鐨勬柟娉曪紝涓嶆秹鍙?qiáng)閰嵕|拰姝e垯琛ㄨ揪寮忚娉曠殑鍐呭銆?
浣跨敤PCRE涓昏鏄嬌鐢ㄤ笅闈㈢殑鍥涗釜鍑芥暟錛屽榪欏洓涓嚱鏁版湁浜嗕簡瑙o紝浣跨敤PCRE搴撶殑鏃跺欏氨浼?xì)绠鍗曞緢澶氥?
pcre_compile() /pcre_compile2()
pcre_study()
pcre_exec()
1. pcre_compile() /pcre_compile2()錛?姝e垯琛ㄨ揪寮忓湪浣跨敤涔嬪墠瑕佺粡榪囩紪璇戙?
pcre *pcre_compile(const char *pattern, int options, const char **errptr, int *erroffset, const unsigned char *tableptr);
pcre *pcre_compile2(const char *pattern, int options, int *errorcodeptr, const char **errptr, int *erroffset, const unsigned char *tableptr);
緙栬瘧鐨勭洰鐨勬槸灝嗘鍒欒〃杈懼紡鐨刾attern杞崲鎴怭CRE寮曟搸鑳藉璇嗗埆鐨勭粨鏋勶紙struct real_pcre錛夈?
榪樻病鏈夊緙栬瘧鐨勮繃紼嬭繘琛屽垎鏋?
2. pcre_study錛堬級(jí)錛?/strong>瀵圭紪璇戝悗鐨勬鍒欒〃杈懼紡緇撴瀯(struct real_pcre)榪涜鍒嗘瀽鍜屽涔?瀛︿範(fàn)鐨勭粨鏋滄槸涓涓暟鎹粨鏋?struct pcre_extra),榪欎釜鏁版嵁緇撴瀯榪炲悓緙栬瘧鍚庣殑瑙勫垯(struct real_pcre)鍙互涓璧烽佺粰pcre_exec鍗曞厓榪涜鍖歸厤. If a compiled pattern is going to be used several times, it is worth spending more time analyzing it in order to speed up the time taken for matching. The function pcre_study() takes a pointer to a compiled pattern as its first argument. If studying the pattern produces additional information that will help speed up matching, pcre_study() returns a pointer to a pcre_extra block, in which the study_data field points to the results of the study. pcre_study錛堬級(jí)鐨勫紩鍏ヤ富瑕佹槸涓轟簡鍔犻熸鍒欒〃杈懼紡鍖歸厤鐨勯熷害.(涓轟粈涔堝涔?fàn)鍚帪p兘鍔犻熷憿?)榪欎釜榪樻槸姣旇緝鏈夌敤鐨?鍙互灝嗘鍒欒〃杈懼紡緙栬瘧,瀛︿範(fàn)鍚庝繚瀛樺埌涓涓枃浠舵垨鍐呭瓨涓?榪欐牱榪涜鍖歸厤鐨勬椂鍊欐晥鐜囨瘮杈冩悶.snort涓氨鏄繖鏍峰仛鐨? 3. pcre_exec錛堬級(jí)錛?/strong>鏍規(guī)嵁姝e垯琛ㄨ揪寮忓埌鎸囧畾鐨勫瓧絎︿覆涓繘琛屾煡鎵懼拰鍖歸厤,騫惰緭鍑哄尮閰嶇殑緇撴灉. The function pcre_exec() is called to match a subject string against a compiled pattern, which is passed in the code argument. If the pattern has been studied, the result of the study should be passed in the extra argument. This function is the main matching facility of the library, and it operates in a Perl-like manner. 4. Snort涓浣曚嬌鐢≒CRE鍛?snort涓互鎻掍歡鐨勫艦寮忚皟鐢≒CRE榪涜姝e垯琛ㄨ揪寮忕殑鍖歸厤銆? 1錛夎繘琛屾鍒欒〃杈懼紡鐨勫垵濮嬪寲銆? InitializeDetection--> RegisterRules-->RegisterOneRule-->PCRESetup(Just for OPTION_TYPE_PCRE)->pcre_compile and pcre_study. All will be stored in a structure called PCREInfo in the memory. 2.) 瑙勫垯鐨勫尮閰嶃侱etectionCheckRule-->ruleMatch-->ruleMatchInternal-->pcreMatch(OPTION_TYPE_PCRE)->pcre_test-->pcre_exec. 5.緙栬瘧PCRE on TILERA platform. 1) tar -xjvf pcre-7.9.tar.bz2 2) Modify config.sub to support tile architecture. We wish to use DE>HOST=tileDE>, but the DE>tileDE> architecture is not yet standard, so may not exist in the DE>config.subDE> file. If necessary, add these lines in the alphabetical list of architectures (typically about 1,100 lines down): tile*)
basic_machine=tile-tilera
os=-linux-gnu
;;
3) Compile PCRE on tile Linux.
** Start up TILERA card through tile-monitor.
tile-monitor --pci --mount-tile /usr \
--mount-tile /bin --mount-tile /sbin --mount-tile /etc --mount-tile /lib \
--mkdir /mnt/libs --mount /libs-compile /mnt/libs \
--mkdir /mnt/mde --mount $TILERA_ROOT /mnt/mde* ./configure --build=tile --prefix=/usr lt_cv_sys_max_cmd_len=262144 --disable-cpp
//緙栬瘧鐨勬椂鍊欐病鏈変嬌鑳絚++鐨勬敮鎸併?/pre>
pcre-7.9 configuration summary:
pcre-7.9 configuration summary:
Install prefix .................. : /usr
C preprocessor .................. : gcc -E
C compiler ...................... : gcc
C++ preprocessor ................ : g++ -E
C++ compiler .................... : g++
Linker .......................... : /usr/bin/ld
C preprocessor flags ............ :
C compiler flags ................ : -O2
C++ compiler flags .............. : -O2
Linker flags .................... :
Extra libraries ................. : Build C++ library ............... : no
Enable UTF-8 support ............ : no
Unicode properties .............. : no
Newline char/sequence ........... : lf
\R matches only ANYCRLF ......... : no
EBCDIC coding ................... : no
Rebuild char tables ............. : no
Use stack recursion ............. : yes
POSIX mem threshold ............. : 10
Internal link size .............. : 2
Match limit ..................... : 10000000
Match limit recursion ........... : MATCH_LIMIT
Build shared libs ............... : yes
Build static libs ............... : yes
Link pcregrep with libz ......... : no
Link pcregrep with libbz2 ....... : no
Link pcretest with libreadline .. : no* make
* make install
4) Compile the PCRE demo code and test PCRE lib on TILERA linux. PCRE 鐨勬簮鏂囦歡涓彁渚涗簡涓や釜demo紼嬪簭錛屼竴涓槸姣旇緝綆鍗曠殑pcredemo.c錛屽緢瀹規(guī)槗鐞嗚В錛涘彟澶栦竴涓槸pcretest.c錛岃繖涓瘮杈冨叏闈€佸畬鏁寸殑浠嬬粛浜唒cre搴撶殑浣跨敤銆傝繖涓や釜demo鏈韓灝辨槸闈炲父濂界殑瀛︿範(fàn)鏉愭枡銆?/pre># gcc -o pcredemo pcredemo.c -lpcre
# ./pcredemo 'cat|dog' 'the cat sat on the mat'Match succeeded at offset 4
0: cat
No named substrings
# ./pcredemo -g 'cat|dog' 'the dog sat on the cat'Match succeeded at offset 4
0: dog
No named substringsMatch succeeded again at offset 19
0: cat
No named substrings//鍙傝冭祫鏂?
PCRE婧愮爜鏂囨。:pcre-7.9/doc/html
]]>
鈥斺?zlib manaul
deflate綆楁硶鍦?span lang="EN-US">rfc1951涓湁璇︾粏鐨勮鏄庛?span lang="EN-US">
zlib鍚屾椂鍙堟槸涓縐嶆暟鎹牸寮忥紝浣跨敤zlib搴撳帇緙╁悗鐨勬暟鎹細(xì)鍦?span lang="EN-US">deflate鏁版嵁鐨勫ご鍜屽熬娣誨姞淇℃伅錛屽艦鎴?span lang="EN-US">zlib鏍煎紡鐨勬暟鎹?span lang="EN-US">
gzip涔熸槸涓縐嶆暟鎹帇緙╂牸寮忥紝鍙互澶т綋鍒嗕負(fù)澶撮儴錛屾暟鎹儴鍜屽熬閮ㄤ笁涓儴鍒嗭紝鍏朵腑澶撮儴鍜屽熬閮ㄤ富瑕佹槸涓浜涙枃妗e睘鎬у拰鏍¢獙淇℃伅錛?span lang="EN-US">rfc1952錛夛紝鏁版嵁閮ㄤ富瑕佹槸鐢?span lang="EN-US">deflate鏂規(guī)硶鍘嬬緝寰楀埌鐨勬暟鎹?span lang="EN-US">
zlib搴撻粯璁ょ殑鍘嬬緝鏂規(guī)硶騫朵笉鏄?span lang="EN-US">gzip鐨勶紝鑰屾槸zlib鐨勶紝鍥犳浣跨敤zlib鍘嬬緝寰楀埌gzip鏍煎紡鐨勬暟鎹湁涓ょ鏂規(guī)硶錛?span lang="EN-US">
1. 浣跨敤zlib鎻愪緵鐨?span lang="EN-US">gz***緋誨垪鍑芥暟鍙互鐩存帴鎶婃兂瑕佺殑鍐呭鍐欏叆涓涓鐩?span lang="EN-US">gzip鏂囦歡錛?
2. 濡傛灉鎯沖湪鍐呭瓨涓敓鎴?span lang="EN-US">gzip鏍煎紡鐨勬暟鎹紝鍙互鍦ㄥ垵濮嬪寲鐨勬椂鍊欒皟鐢?span lang="EN-US">inflateInit2鍑芥暟錛屽茍鎸囧畾涓?span lang="EN-US">gzip鏍煎紡錛屼唬鐮佸涓嬶細(xì)
| z_stream d_stream; |
涔嬪悗錛岀敤deflate鍘嬬緝鍑烘潵鐨勬暟鎹氨鏄?span lang="EN-US">gzip鐨勪簡銆?/span>
銆銆zlib鏄彁渚涜祫鏂欏帇緙╀箣鐢ㄧ殑鍑藉紡搴擄紝鐢?span lang="EN-US">Jean-loup Gailly涓?span lang="EN-US">Mark Adler鎵寮鍙戯紝鍒濈増0.9鐗堝湪
銆銆zlib鏄敤浜庤祫鏂欏帇緙╃殑鍑藉紡搴擄紝鐢?span lang="EN-US">Jean-loup Gailly涓?span lang="EN-US">Mark Adler鎵寮鍙戯紝鏄嬌鐢ㄦ娊璞″寲鐨?span lang="EN-US">DEFLATE鍘嬬緝綆楁硶gzip鏂囦歡鍘嬬緝紼嬪簭銆傚垵鐗?span lang="EN-US">0.9鐗堝湪
銆銆鎴嚦2007騫?span lang="EN-US">3鏈堬紝zlib鏄寘鍚湪Coverity鐨勭編鍥藉浗鍦熷畨鍏ㄩ儴璧炲姪鑰呴夋嫨緇х畫瀹℃煡鐨勫紑婧愰」鐩?
[緙栬緫鏈]
鍔熻兘
銆銆* 鏁版嵁澶?span lang="EN-US">(header) - zlib鑳戒嬌鐢ㄤ竴涓?span lang="EN-US">gzip鏁版嵁澶達(dá)紝zlib鏁版嵁澶存垨鑰呬笉浣跨敤鏁版嵁澶村帇緙╂暟鎹?span lang="EN-US">
銆銆閫氬父鎯呭喌涓嬶紝鏁版嵁鍘嬬緝浣跨敤zlib鏁版嵁澶達(dá)紝鍥犱負(fù)榪欐彁渚涢敊璇暟鎹嫻嬨傚綋鏁版嵁涓嶄嬌鐢ㄦ暟鎹ご鍐欏叆鏃訛紝緇撴灉鏄病鏈変換浣曢敊璇嫻嬬殑鍘熷DEFLATE鏁版嵁錛岄偅涔堣В鍘嬬緝杞歡鐨勮皟鐢ㄨ呯煡閬撳帇緙╂暟鎹湪浠涔堝湴鏂圭粨鏉熴?span lang="EN-US">
銆銆gzip鏁版嵁澶存瘮zlib鏁版嵁澶磋澶э紝鍥犱負(fù)瀹冧繚瀛樹簡鏂囦歡鍚嶅拰鍏朵粬鏂囦歡緋葷粺淇℃伅錛屼簨瀹炰笂榪欐槸騫挎硾浣跨敤鐨?span lang="EN-US">gzip鏂囦歡鐨勬暟鎹ご鏍煎紡銆?span style="color: red">娉ㄦ剰zlib鍑藉紡搴撴湰韜笉鑳藉垱寤轟竴涓?span lang="EN-US">gzip鏂囦歡錛屼絾鏄畠鐩稿綋杞繪澗鐨勯氳繃鎶婂帇緙╂暟鎹啓鍏ュ埌涓涓湁gzip鏂囦歡澶寸殑鏂囦歡涓?span lang="EN-US">
銆銆* 綆楁硶 - 鐩墠zlib浠呮敮鎸佷竴涓?span lang="EN-US">LZ77鐨勫彉縐嶇畻娉曪紝DEFLATE鐨勭畻娉曘?span lang="EN-US">
銆銆榪欎釜綆楁硶浣跨敤寰堝皯鐨勭郴緇熻祫婧愶紝瀵瑰悇縐嶆暟鎹彁渚涘緢濂界殑鍘嬬緝鏁堟灉銆傝繖涔熸槸鍦?span lang="EN-US">ZIP妗f涓棤涓渚嬪鐨勪嬌鐢ㄨ繖涓畻娉曘傦紙灝界zip鏂囦歡鏍煎紡涔熸敮鎸佸嚑縐嶅叾浠栫殑綆楁硶錛夈?span lang="EN-US">
銆銆鐪嬭搗鏉?span lang="EN-US">zlib鏍煎紡灝嗕笉浼?xì)琚墿灞曚娇鐢ㄤ恢M綍鍏朵粬綆楁硶錛屽敖綆℃暟鎹ご鍙互鏈夎繖縐嶅彲鑳芥с?span lang="EN-US">
銆銆* 浣跨敤璧勬簮 - 鍑藉紡搴撴彁渚涗簡瀵瑰鐞嗗櫒鍜屽唴瀛樹嬌鐢ㄦ帶鍒剁殑鑳藉姏
銆銆涓嶅悓鐨勫帇緙╃駭鍒暟鍊煎彲浠ユ寚紺轟笉鍚岀殑鍘嬬緝鎵ц閫熷害銆?span lang="EN-US">
銆銆榪樻湁鍐呭瓨鎺у埗綆$悊鐨勫姛鑳姐傝繖鍦ㄤ竴浜涜濡傚祵鍏ュ紡緋葷粺榪欐牱鍐呭瓨鏈夐檺鍒剁殑鐜涓槸鏈夌敤鐨勩?span lang="EN-US">
銆銆* 絳栫暐 - 鍘嬬緝鍙互閽堝鐗瑰畾綾誨瀷鐨勬暟鎹繘琛屼紭鍖?span lang="EN-US">
銆銆濡傛灉浣犳繪槸浣跨敤zlib搴撳帇緙╁帇緙╃壒瀹氱被鍨嬬殑鏁版嵁錛岄偅涔堝彲浠ヤ嬌鐢ㄦ湁閽堝鎬х殑絳栫暐鍙互鎻愰珮鍘嬬緝鏁堢巼鍜屾ц兘銆備緥濡傦紝濡傛灉浣犵殑鏁版嵁鍖呭惈寰堥暱鐨勯噸澶嶆暟鎹紝閭d箞鍙互鐢?span lang="EN-US">RLE錛堣繍琛岄暱搴︾紪鐮侊級(jí)絳栫暐錛屽彲鑳戒細(xì)鏈夋洿濂界殑緇撴灉銆?span lang="EN-US">
銆銆瀵逛簬涓鑸殑鏁版嵁錛岄粯璁ょ殑絳栫暐鏄閫夈?span lang="EN-US">
銆銆* 閿欒澶勭悊 - 閿欒鍙互琚彂鐜板拰璺寵繃
銆銆鏁版嵁娣蜂貢鍙互琚嫻嬶紙鍙鏁版嵁鍜?span lang="EN-US">zlib鎴栬?span lang="EN-US">gzip鏁版嵁澶翠竴璧瘋鍐欏叆錛嶅弬瑙佷笂闈級(jí)
銆銆姝ゅ錛屽鏋滃叏鍒鋒柊鐐癸紙full-flush points錛夎鍐欏叆鍒板帇緙╁悗鐨勬暟鎹祦涓紝閭d箞閿欒鏁版嵁鏄彲浠ヨ璺寵繃鐨勶紝騫朵笖瑙e帇緙╁皢閲嶆柊鍚屾鍒頒笅涓叏鍒鋒柊鐐廣傦紙閿欒鏁版嵁鐨勬棤閿欐仮澶嶈鎻愪緵錛夈傚叏鍒鋒柊鐐規(guī)妧鏈浜庡湪涓嶅彲闈犵殑閫氶亾涓婄殑澶ф暟鎹祦鏄緢鏈夌敤鐨勶紝涓浜涜繃鍘葷殑鏁版嵁涓㈠け鏄笉閲嶈鐨勶紙渚嬪澶氬獟浣撴暟鎹級(jí)錛屼絾鏄緩绔嬪お澶氱殑鍏ㄥ埛鏂扮偣浼?xì)鏋佸ぇ鐨勫奖鍝嶉熷害鍜屽帇緙┿?span lang="EN-US">
銆銆* 鏁版嵁闀垮害 - 瀵逛簬鍘嬬緝鍜岃В鍘嬬緝錛屾病鏈夋暟鎹暱搴︾殑闄愬埗
銆銆閲嶅璋冪敤搴撳嚱鏁板厑璁稿鐞嗘棤闄愮殑鏁版嵁鍧椼備竴浜涜緟鍔╀唬鐮侊紙璁℃暟鍙橀噺錛夊彲鑳戒細(xì)婧㈠嚭錛屼絾鏄笉褰卞搷瀹為檯鐨勫帇緙╁拰瑙e帇緙┿?span lang="EN-US">
銆銆褰撳帇緙╀竴涓暱錛堟棤闄愶級(jí)鏁版嵁嫻佹椂錛屾渶濂藉啓鍏ュ叏鍒鋒柊鐐廣?
[緙栬緫鏈]
浣跨敤zlib鐨勮蔣浠?span lang="EN-US">
銆銆浠婂ぉ錛?span lang="EN-US">zlib鏄竴縐嶄簨瀹炰笂鐨勪笟鐣屾爣鍑嗭紝浠ヨ嚦浜庡湪鏍囧噯鏂囨。涓紝zlib鍜?span lang="EN-US">DEFLATE甯稿父浜掓崲浣跨敤銆傛暟浠ュ崈璁$殑搴旂敤紼嬪簭鐩存帴鎴栭棿鎺ヤ緷闈?span lang="EN-US">zlib鍘嬬緝鍑藉紡搴?/span>錛?span lang="EN-US">[2]錛屽寘鎷細(xì)
銆銆* Linux鏍稿績錛氫嬌鐢?span lang="EN-US">zlib浠ュ疄浣滅綉緇滃崗瀹氱殑鍘嬬緝銆佹。妗堢郴緇熺殑鍘嬬緝浠ュ強(qiáng)寮鏈烘椂瑙e帇緙╄嚜韜殑鏍稿績銆?span lang="EN-US">
銆銆* libpng錛岀敤浜?span lang="EN-US">PNG鍥懼艦鏍煎紡鐨勪竴涓疄鐜幫紝瀵?span lang="EN-US">bitmap鏁版嵁瑙勫畾浜?span lang="EN-US">DEFLATE浣滀負(fù)嫻佸帇緙╂柟娉曘?span lang="EN-US">
銆銆* Apache錛氫嬌鐢?span lang="EN-US">zlib瀹炰綔http 1.1銆?span lang="EN-US">
銆銆* OpenSSH銆?span lang="EN-US">OpenSSL錛氫互zlib杈懼埌鏈浣?jīng)_寲鍔犲瘑緗戠粶浼犺緭銆?span lang="EN-US">
銆銆* FFmpeg錛氫互zlib璇誨啓Matroska絳変互DEFLATE綆楁硶鍘嬬緝鐨勫濯掍綋涓叉祦鏍煎紡銆?span lang="EN-US">
銆銆* rsync錛氫互zlib鏈浣?jīng)_寲榪滅鍚屾鏃剁殑浼犺緭銆?span lang="EN-US">
銆銆* The dpkg and RPM package managers, which use zlib to unpack files from compressed software packages.
銆銆* Subversion 銆?span lang="EN-US">Git鍜?span lang="EN-US"> CVS 鐗堟湰鎺у埗緋葷粺錛屼嬌鐢?span lang="EN-US">zlib鏉ュ帇緙╁拰榪滅浠撳簱鐨勯氳嫻侀噺銆?span lang="EN-US">
銆銆* dpkg鍜?span lang="EN-US">RPM絳夊寘綆$悊杞歡錛氫互zlib瑙e帇緙?span lang="EN-US">RPM鎴栬呭叾浠栧皝鍖呫?span lang="EN-US">
銆銆鍥犱負(fù)鍏朵唬鐮佺殑鍙Щ妞嶆э紝瀹芥澗鐨勮鍙互鍙?qiáng)杈優(yōu)畯鐨勫唴瀛樺崰鐢ㄥQ?span lang="EN-US">zlib鍦ㄨ澶氬祵鍏ュ紡璁懼涓篃鏈夊簲鐢ㄣ?span lang="EN-US">
zlib鍜実zip鏄竴鍥炰簨錛実zip涓嶈繃澶栭潰澶氫簡涓涓枃浠舵牸寮忥紝浣滆呴兘鏄悓涓涓漢銆?
鎹7zip姣攝lib鏈夋洿楂樼殑鍘嬬緝姣斿拰瑙e帇閫熷害,浣嗘病鏈夌敤榪囥?/font>
BOOL Glob_Fun::LoadFile(const char* file_name, vector<char>& vec_file)
{
vec_file.clear();
if ((NULL == file_name))
return FALSE;
CFile file;
char szBuf[1024 * 10] = "", *pTmp = NULL;
int nRead = 0;
int file_len = 0;
if(FALSE == file.Open(file_name,CFile::modeRead))
return FALSE;
if(0 >= (file_len=file.GetLength()))
{
file.Close();
return TRUE;
}
vec_file.resize(file_len);
pTmp = &vec_file[0];
do
{
nRead = file.Read(szBuf, sizeof(szBuf));
memcpy(pTmp, szBuf, nRead);
pTmp += nRead;
}while (nRead > 0);
file.Close();
return TRUE;
}
char* Glob_Fun::MemFind(const void* src_buf, int src_len, const void* find_buf, int find_len)
{
if ((NULL == src_buf) || (NULL == find_buf)
|| (src_len <= 0) || (find_len <= 0))
return NULL;
char*cp = (char*)src_buf;
char*src_end = (char*)src_buf + src_len;
char*find_end = (char*)find_buf + find_len;
char*s_src = NULL, *s_find = NULL;
while (cp < src_end)
{
s_src = cp;
s_find = (char*)find_buf;
while (s_src < src_end && s_find < find_end && *s_src == *s_find)
++s_src, ++s_find;
if (s_find == find_end)
return(cp);
++cp;
}
return(NULL);
}
BOOL Glob_Fun::ParserMem(
const void* src_buf,
int src_len,
const vector< vector<char> >& vec_par,
vector< vector<char> >& vec_result)
{
if ((NULL == src_buf) || (src_len <= 0) || vec_par.size() <= 0)
return FALSE;
for (size_t t = 0; t < vec_par.size(); ++t)
{
if(0 >= vec_par[t].size())
return FALSE;
}
vec_result.clear();
vector<char> vec_tmp;
BOOL bMatched = FALSE;
int nParCount = vec_par.size();
int nParTick = 0;
char*cp = (char*)src_buf;
char*src_end = (char*)src_buf + src_len;
int nParLen = (int)vec_par[0].size();
char*find_buf = (char*)&(vec_par[0][0]);
char*find_end = find_buf + nParLen;
char*s_src = NULL, *s_find = NULL;
while (cp < src_end)
{
s_src = cp;
s_find = (char*)find_buf;
while (s_src < src_end && s_find < find_end && *s_src == *s_find)
++s_src,++s_find;
if (s_find == find_end)
{
bMatched = TRUE;
cp += nParLen;
vec_result.push_back(vec_tmp);
vec_tmp.clear();
++nParTick;
if(nParCount == nParTick)
nParTick = 0;
nParLen = (int)(vec_par[nParTick].size());
find_buf = (char*)&(vec_par[nParTick][0]);
find_end = find_buf + nParLen;
}
else
{
vec_tmp.push_back(*cp);
++cp;
}
}
if(TRUE == bMatched)
vec_result.push_back(vec_tmp);
return(bMatched);
}
BOOL Glob_Fun::ParserMem(
const void* src_buf,
int src_len,
const vector<char>& vec_par,
vector< vector<char> >& vec_result)
{
if ((NULL == src_buf) || (src_len <= 0) || vec_par.size() <= 0)
return FALSE;
vec_result.clear();
vector<char> vec_tmp;
BOOL bMatched = FALSE;
char*cp = (char*)src_buf;
char*src_end = (char*)src_buf + src_len;
int nParLen = (int)vec_par.size();
char*find_buf = (char*)&(vec_par[0]);
char*find_end = find_buf + nParLen;
char*s_src = NULL, *s_find = NULL;
while (cp < src_end)
{
s_src = cp;
s_find = (char*)find_buf;
while (s_src < src_end && s_find < find_end && *s_src == *s_find)
++s_src, ++s_find;
if (s_find == find_end)
{
bMatched = TRUE;
cp += nParLen;
vec_result.push_back(vec_tmp);
vec_tmp.clear();
}
else
{
vec_tmp.push_back(*cp);
++cp;
}
}
if(TRUE == bMatched)
vec_result.push_back(vec_tmp);
return(bMatched);
}
BOOL Glob_Fun::ParserMem(
const void* src_buf,
int src_len,
const char* par_buf,
vector< vector<char> >& vec_result)
{
if ((NULL == src_buf) || (src_len <= 0) || strlen(par_buf) <= 0)
return FALSE;
vec_result.clear();
vector<char> vec_tmp;
BOOL bMatched = FALSE;
char*cp = (char*)src_buf;
char*src_end = (char*)src_buf + src_len;
int nParLen = strlen(par_buf);
char*find_buf = (char*)par_buf;
char*find_end = find_buf + nParLen;
char*s_src = NULL, *s_find = NULL;
while (cp < src_end)
{
s_src = cp;
s_find = (char*)find_buf;
while (s_src < src_end && s_find < find_end && *s_src == *s_find)
++s_src, ++s_find;
if (s_find == find_end)
{
bMatched = TRUE;
cp += nParLen;
vec_result.push_back(vec_tmp);
vec_tmp.clear();
}
else
{
vec_tmp.push_back(*cp);
++cp;
}
}
if(TRUE == bMatched)
vec_result.push_back(vec_tmp);
return(bMatched);
}
BOOL Glob_Fun::ParserMem(
const void* src_buf,
int src_len,
const char* par_buf,
vector<string>& vec_result)
{
if ((NULL == src_buf) || (src_len <= 0) || strlen(par_buf) <= 0)
return FALSE;
vec_result.clear();
string vec_tmp;
BOOL bMatched = FALSE;
char*cp = (char*)src_buf;
char*src_end = (char*)src_buf + src_len;
int nParLen = strlen(par_buf);
char*find_buf = (char*)par_buf;
char*find_end = find_buf + nParLen;
char*s_src = NULL, *s_find = NULL;
while (cp < src_end)
{
s_src = cp;
s_find = (char*)find_buf;
while (s_src < src_end && s_find < find_end && *s_src == *s_find)
++s_src, ++s_find;
if (s_find == find_end)
{
bMatched = TRUE;
cp += nParLen;
vec_result.push_back(vec_tmp);
vec_tmp.clear();
}
else
{
vec_tmp.push_back(*cp);
++cp;
}
}
if(TRUE == bMatched)
vec_result.push_back(vec_tmp);
return(bMatched);
}