• <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
            久久亚洲AV成人无码国产| 久久综合国产乱子伦精品免费| 99久久夜色精品国产网站 | 久久精品国产精品国产精品污| 日韩电影久久久被窝网| 欧美久久久久久精选9999| 亚洲欧美成人综合久久久| 蜜臀av性久久久久蜜臀aⅴ麻豆| 久久成人精品视频| 人妻无码久久精品| 伊人久久精品线影院| 亚洲午夜精品久久久久久app| 久久香综合精品久久伊人| 999久久久国产精品| 国内精品人妻无码久久久影院| 久久亚洲视频| 亚洲а∨天堂久久精品| 97超级碰碰碰碰久久久久| 人妻无码αv中文字幕久久琪琪布| 伊人久久精品线影院| 日本一区精品久久久久影院| 久久久中文字幕| 精品久久久久久久| 亚洲国产二区三区久久| 99久久成人18免费网站| 久久久精品久久久久久| 韩国三级中文字幕hd久久精品 | 伊人久久大香线蕉影院95| 东京热TOKYO综合久久精品| 久久天天躁狠狠躁夜夜96流白浆| 18禁黄久久久AAA片| 色综合久久久久久久久五月| 久久国产热精品波多野结衣AV| 性色欲网站人妻丰满中文久久不卡| 久久狠狠爱亚洲综合影院| 国产精品美女久久久m| 欧美日韩精品久久久免费观看| 国产精品久久久久久久久久影院| 精品国产乱码久久久久久1区2区| 久久精品国产清自在天天线| 无码人妻少妇久久中文字幕蜜桃 |