• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見(jiàn)諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            zlib使用defalte, gzip的例子

            zlib是一個(gè)比較通用的壓縮庫(kù),通過(guò)在程序中引入zlib,可以方便的對(duì)數(shù)據(jù)進(jìn)行壓縮。今天花了點(diǎn)時(shí)間研究了一下,在tbuldr中實(shí)現(xiàn)了直接將數(shù)據(jù)庫(kù)中的數(shù)據(jù)導(dǎo)出為gzip文件的功能。

            下載zlib源代碼,對(duì)于Linux,可以編譯成靜態(tài)庫(kù),然后將zlib.h,libz.a(如有必要,再加上zonf.h)和程序代碼放置到同一個(gè)目錄,編譯的時(shí)候包含libz.a即可。

            #./configure
            #make
            #make install
            

            如果要編譯成動(dòng)態(tài)庫(kù),則只需要第一步改成./configure -s即可。

            廢話少說(shuō),下面是一段演示代碼,非常簡(jiǎn)單:

            #include <stdio.h>
            #include "zlib.h"
            
            int main()
            {
              char *data = "this is a gzip test from NinGoo.net";
              gzFile *fp=NULL;
              fp=gzopen("test_out.gz","wb");
              gzwrite(fp,data,strlen(data));
              gzclose(fp);
            }
            

            編譯:

            gcc -o test test.c libz.a
            

            執(zhí)行:

            $./test
            $gzip -d test_out.gz
            $more test_out
            this is a gzip test from NinGoo.net
            

            tbuldr中,只需要在file參數(shù)指定的文件名后面加上.gz,就會(huì)自動(dòng)輸出為gzip格式的文件。至此,tbuldr已基本實(shí)現(xiàn)了sqluldr2的全部功能,性能測(cè)試結(jié)果也不相上下了。

             

            另外,zlib也可以在內(nèi)存中對(duì)數(shù)據(jù)進(jìn)行壓縮和解壓縮,參考:
            http://hispider.googlecode.com/svn/trunk/devel/hispider/src/utils/zstream.c

             

            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            #include <errno.h>
            #include <zlib.h>
            /* Compress data */
            int zcompress(Bytef *data, uLong ndata, 
            	Bytef *zdata, uLong *nzdata)
            {
            	z_stream c_stream;
            	int err = 0;
            
            	if(data && ndata > 0)
            	{
            		c_stream.zalloc = (alloc_func)0;
            		c_stream.zfree = (free_func)0;
            		c_stream.opaque = (voidpf)0;
            		if(deflateInit(&c_stream, Z_DEFAULT_COMPRESSION) != Z_OK) return -1;
            		c_stream.next_in  = data;
            		c_stream.avail_in  = ndata;
            		c_stream.next_out = zdata;
            		c_stream.avail_out  = *nzdata;
            		while (c_stream.avail_in != 0 && c_stream.total_out < *nzdata) 
            		{
            			if(deflate(&c_stream, Z_NO_FLUSH) != Z_OK) return -1;
            		}
                    if(c_stream.avail_in != 0) return c_stream.avail_in;
            		for (;;) {
            			if((err = deflate(&c_stream, Z_FINISH)) == Z_STREAM_END) break;
            			if(err != Z_OK) return -1;
            		}
            		if(deflateEnd(&c_stream) != Z_OK) return -1;
            		*nzdata = c_stream.total_out;
            		return 0;
            	}
            	return -1;
            }
            
            /* Compress gzip data */
            int gzcompress(Bytef *data, uLong ndata, 
            	Bytef *zdata, uLong *nzdata)
            {
            	z_stream c_stream;
            	int err = 0;
            
            	if(data && ndata > 0)
            	{
            		c_stream.zalloc = (alloc_func)0;
            		c_stream.zfree = (free_func)0;
            		c_stream.opaque = (voidpf)0;
            		if(deflateInit2(&c_stream, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 
                                -MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK) return -1;
            		c_stream.next_in  = data;
            		c_stream.avail_in  = ndata;
            		c_stream.next_out = zdata;
            		c_stream.avail_out  = *nzdata;
            		while (c_stream.avail_in != 0 && c_stream.total_out < *nzdata) 
            		{
            			if(deflate(&c_stream, Z_NO_FLUSH) != Z_OK) return -1;
            		}
                    if(c_stream.avail_in != 0) return c_stream.avail_in;
            		for (;;) {
            			if((err = deflate(&c_stream, Z_FINISH)) == Z_STREAM_END) break;
            			if(err != Z_OK) return -1;
            		}
            		if(deflateEnd(&c_stream) != Z_OK) return -1;
            		*nzdata = c_stream.total_out;
            		return 0;
            	}
            	return -1;
            }
            
            /* Uncompress data */
            int zdecompress(Byte *zdata, uLong nzdata,                 
                    Byte *data, uLong *ndata)
            {
            	int err = 0;
            	z_stream d_stream; /* decompression stream */
            
            	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(inflateInit(&d_stream) != 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) return -1;
            	}
            	if(inflateEnd(&d_stream) != Z_OK) return -1;
            	*ndata = d_stream.total_out;
            	return 0;
            }
            
            /* HTTP gzip decompress */
            int httpgzdecompress(Byte *zdata, uLong nzdata,                 
                    Byte *data, uLong *ndata)
            {
                int err = 0;
                z_stream d_stream = {0}; /* decompression 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;
                return 0;
            }
            
            /* Uncompress gzip data */
            int gzdecompress(Byte *zdata, uLong nzdata,                 
                    Byte *data, uLong *ndata)
            {
                int err = 0;
                z_stream d_stream = {0}; /* decompression 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, -MAX_WBITS) != Z_OK) return -1;
                //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;
                return 0;
            }
            
            #ifdef _DEBUG_ZSTREAM
            #define BUF_SIZE 65535
            int main()
            {
            	char *data = "kjdalkfjdflkjdlkfjdklfjdlkfjlkdjflkdjflddajfkdjfkdfaskf;ldsfk;ldakf;ldskfl;dskf;ld";	
            	uLong ndata = strlen(data);	
            	Bytef zdata[BUF_SIZE];
            	uLong nzdata = BUF_SIZE;
            	Bytef  odata[BUF_SIZE];
            	uLong nodata = BUF_SIZE;
            	
            	memset(zdata, 0, BUF_SIZE);
            	//if(zcompress((Bytef *)data, ndata, zdata, &nzdata) == 0)
            	if(gzcompress((Bytef *)data, ndata, zdata, &nzdata) == 0)
            	{
            		fprintf(stdout, "nzdata:%d %s\n", nzdata, zdata);
            		memset(odata, 0, BUF_SIZE);
            		//if(zdecompress(zdata, ndata, odata, &nodata) == 0)
            		if(gzdecompress(zdata, ndata, odata, &nodata) == 0)
            		{
            			fprintf(stdout, "%d %s\n", nodata, odata);
            		}
            	}
            }
            #endif
            

            posted on 2011-06-05 03:10 肥仔 閱讀(10454) 評(píng)論(3)  編輯 收藏 引用 所屬分類: Windows開(kāi)發(fā)

            評(píng)論

            # re: zlib使用defalte, gzip的例子[未登錄](méi)  回復(fù)  更多評(píng)論   

            static char dummy_head[2] =
            {
            0x8 + 0x7 * 0x10,
            (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
            };


            static char dummy_head[2] =
            {
            0xB + 0x8 * 0x10,
            (((0x8 + 0x7 * 0x10) * 0x100 + 30) / 31 * 31) & 0xFF,
            };


            gzip頭兩個(gè)固定byte不是31,120而是31,139
            2013-07-15 16:24 | andy

            # re: zlib使用defalte, gzip的例子[未登錄](méi)  回復(fù)  更多評(píng)論   

            哦,這個(gè)dummy_head[2]計(jì)算出來(lái)的內(nèi)容是{120,1}表示啥意思?。?
            2013-07-15 17:05 | andy

            # re: zlib使用defalte, gzip的例子[未登錄](méi)  回復(fù)  更多評(píng)論   

            哦,原來(lái)是在構(gòu)建zlib的頭
            2013-07-15 19:12 | andy
            欧美午夜精品久久久久久浪潮| 色欲综合久久躁天天躁| 国产叼嘿久久精品久久| 国产亚洲婷婷香蕉久久精品| 中文字幕一区二区三区久久网站 | 女人香蕉久久**毛片精品| 国产AV影片久久久久久| 99麻豆久久久国产精品免费| 久久久久九九精品影院| 久久久久香蕉视频| 精品久久综合1区2区3区激情| 一本一道久久综合狠狠老| 欧美亚洲色综久久精品国产| 99久久国产免费福利| 国产精品狼人久久久久影院| 国产精品久久久香蕉| 亚洲精品NV久久久久久久久久| 久久夜色tv网站| 精品久久人人爽天天玩人人妻| 亚洲国产二区三区久久| 伊人久久大香线蕉av一区| 99久久精品免费看国产一区二区三区 | 无码国内精品久久人妻蜜桃| 亚洲综合精品香蕉久久网97| 久久精品国产亚洲AV忘忧草18| 亚洲精品综合久久| 九九精品99久久久香蕉| 国产亚洲美女精品久久久| 久久精品亚洲一区二区三区浴池 | 久久精品二区| 麻豆亚洲AV永久无码精品久久| 精品一区二区久久久久久久网站| 久久精品国产亚洲AV大全| 国产美女亚洲精品久久久综合| 香蕉久久影院| 少妇高潮惨叫久久久久久| 97久久综合精品久久久综合| 国产精品久久久久无码av| 97久久婷婷五月综合色d啪蜜芽| 99国产欧美精品久久久蜜芽| 久久精品国产99国产电影网|