• <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
            99热都是精品久久久久久| 久久精品成人免费看| 久久久WWW成人| 一本大道久久香蕉成人网| AV无码久久久久不卡蜜桃| 国产偷久久久精品专区| 婷婷综合久久中文字幕蜜桃三电影 | 2021国内久久精品| 久久久亚洲欧洲日产国码二区| 精品久久一区二区三区| 亚洲欧美精品一区久久中文字幕| 久久精品国产男包| 品成人欧美大片久久国产欧美| 99久久国产宗和精品1上映| 91久久国产视频| 亚洲中文字幕无码一久久区| 亚洲精品国产成人99久久| 亚洲欧美国产日韩综合久久| 色综合久久88色综合天天| A级毛片无码久久精品免费| 国产精品99精品久久免费| 久久亚洲AV无码西西人体| 久久AV高潮AV无码AV| 亚洲欧美日韩精品久久亚洲区 | 色偷偷偷久久伊人大杳蕉| 国产精品熟女福利久久AV| 漂亮人妻被黑人久久精品| 伊人久久大香线蕉成人| 久久精品无码一区二区app| 69久久精品无码一区二区| 久久综合久久自在自线精品自 | 77777亚洲午夜久久多人| 久久精品国产一区二区三区| 久久免费小视频| 伊人色综合久久天天| 国产精品一区二区久久| 久久久久四虎国产精品| 久久综合九色综合精品| 久久综合久久综合九色| 99久久精品免费观看国产| 国产99久久九九精品无码|