• <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 肥仔 閱讀(10492) 評(píng)論(3)  編輯 收藏 引用 所屬分類(lèi): 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
            久久99热只有频精品8| 人人狠狠综合88综合久久| 久久久国产打桩机| 久久狠狠高潮亚洲精品| 久久精品男人影院| 欧美精品九九99久久在观看| 99久久精品国产一区二区 | 热久久最新网站获取| 伊人久久大香线蕉综合Av| 26uuu久久五月天| 久久综合国产乱子伦精品免费| 国产成人久久精品激情| 久久久久国产视频电影| 国产成人久久精品区一区二区| 色欲综合久久躁天天躁| 国产V综合V亚洲欧美久久| 亚洲精品午夜国产va久久| 久久国产一区二区| 亚洲AV无码1区2区久久 | 久久中文字幕一区二区| 一本色综合久久| 久久黄视频| 亚洲天堂久久精品| .精品久久久麻豆国产精品| 久久受www免费人成_看片中文 | 久久天天躁狠狠躁夜夜不卡| 久久精品国产久精国产思思| 久久成人小视频| 久久无码一区二区三区少妇| 91视频国产91久久久| 久久精品a亚洲国产v高清不卡| 久久天天躁狠狠躁夜夜不卡| 四虎影视久久久免费| 久久人搡人人玩人妻精品首页| 99精品伊人久久久大香线蕉| 久久精品麻豆日日躁夜夜躁| 国产激情久久久久久熟女老人 | 亚洲国产二区三区久久| 久久久91精品国产一区二区三区| 久久久久久九九99精品| 国产91色综合久久免费分享|