翻箱倒柜,在这里找到
http://www.google.com/codesearch?hl=en&q=show:IQaFsxIyO24:OxRSJga7rN0:kHBOK1EXgjc&sa=N&ct=rd&cs_p=http://lolsws.tripod.com&cs_f=/0321113594_ch06lev1sec1.html-002&start=1c#和vb.net的声明我就不贴了,调试后发现在c#和vb.net中都能正常压缩解压缩长度<N的字符串,更长的都被截断了~ 要看代码的请跟贴,呵呵VB里面我这样声明的
Public Declare Function InitDecompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" () As Long
Public Declare Function InitCompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" () As LongPublic Declare Function CreateDecompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long, ByVal flags As Long) As Long
Public Declare Function CreateCompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long, ByVal flags As Long) As LongPublic Declare Function ResetDecompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long) As Long
Public Declare Function ResetCompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long) As LongPublic Declare Function DestroyDecompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long) As Long
Public Declare Function DestroyCompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long) As LongPublic Declare Function Decompress Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long, ByVal inBytes As Long, ByVal input_size As Long, ByVal outBytes As Long, ByVal output_size As Long, ByVal input_used As Long, ByVal output_used As Long) As Long
Public Declare Function Compress Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long, ByVal inBytes As Long, ByVal input_size As Long, ByVal outBytes As Long, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long, ByVal compressionLevel As Long) As Long
到现在还没调试出来过,一个字符都没有,呵呵大虾们一起讨论讨论,尤其是Compress 和Decompress 这两函数欢迎接分~~~!!!!

解决方案 »

  1.   

        Private Declare Function Decompress Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long, inBytes() As Byte, ByVal input_size As Long, outBytes() As Byte, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long) As Long
        Private Declare Function Compress Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long, inBytes() As Byte, ByVal input_size As Long, outBytes() As Byte, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long, ByVal compressionLevel As Long) As Long
      

  2.   

    http://www.example-code.com/vb/vb6-gzip-file.asp
      

  3.   

    貌似我的正版HOME版XP中没有GZIP.DLL这个文件
      

  4.   

    GZip.dll原来是字符串解/压缩函数!
    顶!!
      

  5.   


    没有关系,找不到DLL会报错的~
      

  6.   


    你没试吧,这样子context 上会报类型不一致,数组或用户定义类型没指定的compile errorto : GZip.dll原来是字符串解/压缩函数! 为IIS提供压缩传输的组件
      

  7.   

    我的专业版的没有。
    安装的是IIS5标下。。顶下。。分。。顺便接下。。
      

  8.   

    学习。
      
    Option Explicit
      Public WithEvents owinhttp As WinHttp.WinHttpRequest
    Public Function StartWork() As Boolean
      Dim FileNo As Integer
      With owinhttp
        .SetRequestHeader "accept-encoding", "gzip,deflate"
        Call .Open("GET", "http://www.sina.com.cn/", True) ' True 异步 ; False 同步
        .Option(WinHttpRequestOption_UserAgentString) = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
        
        .SetRequestHeader "accept", "*/*"
        .SetRequestHeader "accept-language", "en-us"
        .SetRequestHeader "accept-encoding", "gzip,deflate"
        .SetRequestHeader "connection", "Keep-Alive"
        .SetRequestHeader "cache-control", "no-cache"
        .SetTimeouts 90000, 15000, 80000, 90000
        owinhttp.Send      Do While Not .WaitForResponse(1)
            DoEvents
          Loop
       Dim strContent As String   .ResponseText '怎么解压缩
      StartWork = True
    End Function
      

  9.   

    按照你的声明~
    Option ExplicitPublic Declare Function InitDecompression Lib "c:\windows\system32\inetsrv\gzip.dll" () As Long
    Public Declare Function InitCompression Lib "c:\windows\system32\inetsrv\gzip.dll" () As LongPublic Declare Function CreateDecompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long, ByVal flags As Long) As Long
    Public Declare Function CreateCompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long, ByVal flags As Long) As LongPublic Declare Function ResetDecompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long) As Long
    Public Declare Function ResetCompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long) As LongPublic Declare Function DestroyDecompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long) As Long
    Public Declare Function DestroyCompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long) As LongPrivate Declare Function Decompress Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long, inBytes() As Byte, ByVal input_size As Long, outBytes() As Byte, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long) As Long
    Private Declare Function Compress Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long, inBytes() As Byte, ByVal input_size As Long, outBytes() As Byte, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long, ByVal compressionLevel As Long) As Long
    Option Explicit
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Public Sub Compress(inData() As Byte)
        Dim inLength As Long
        inLength = UBound(inData)
        Dim bufferSize As Long
        bufferSize = 512
        Dim buffer() As Byte
        ReDim buffer(bufferSize)
        Dim context As Long
        Call InitCompression
        Call CreateCompression(context, 1)
        Dim hResult As Long
        hResult = 0
        Dim outUsed As Long
        Dim inUsed As Long
        
        Dim retBytes(0) As Byte
        Do
            outUsed = 0
            inUsed = 0        hResult = Compress(context, inData, inLength, buffer, bufferSize, inUsed, outUsed, 1)
            If 0 <> outUsed Then
                Dim upRetByts As Long
                upRetByts = UBound(retBytes)
                ReDim Preserve retBytes(upRetByts + outUsed)
                Call ArrayCopy(buffer, retBytes, 0, upRetByts, outUsed)
            End If
            inLength = inLength - inUsed
        Loop While (hResult = 0)
        Call ResetCompression(context)End Sub
    Private Sub cmdCompress_Click()
        Dim inBytes(26) As Byte
        Dim i As Integer
        For i = 0 To UBound(inBytes)
            inBytes(i) = i + 65
        Next    Call Compress(inBytes)
    End SubPrivate Sub Form_Load()
        Dim str     As String
        Dim abyte()     As Byte
        str = "擔杮岅abcd1234"
        Dim dByte(15) As Byte
        Dim tmpByt() As Byte
        tmpByt = String2Byte(str)
        Call ArrayCopy(tmpByt, dByte, 0, 0, UBound(tmpByt) + 1)    Call Compress(String2Byte(str))
    End Sub
    Private Function Byte2String(dataByt() As Byte) As String
        Byte2String = StrConv(dataByt, vbUnicode)
    End Function
    Private Function String2Byte(dataStr As String) As Byte()
        String2Byte = StrConv(dataStr, vbFromUnicode)
    End Function
    Private Function ArrayCopy(ByRef arrSource() As Byte, ByRef arrDestination() As Byte, Optional ByVal srcbeginPos As Long = 0, Optional ByVal destbeginPos As Long = 0, Optional ByVal Length As Long = 0) As Boolean
        On Error GoTo errHandler
        ArrayCopy = True
        If Length = 0 Then Length = UBound(arrSource) + 1
        If srcbeginPos + Length > UBound(arrSource) + 1 Then GoTo errHandler
        If destbeginPos + Length > UBound(arrDestination) + 1 Then GoTo errHandler    CopyMemory arrDestination(destbeginPos), arrSource(srcbeginPos), Length
        Exit Function
    errHandler:
        ArrayCopy = False
    End Function
      

  10.   

    C#的能正常加解密一部分数据的代码
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.IO;
    using Microsoft.VisualBasic;
    namespace TestGZip
    {
        public partial class TestGZip : Form
        {
            static int MAX_SIZE =1024;
            [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int InitDecompression();        [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int InitCompression();        [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int CreateDecompression(out IntPtr context, int flags);        [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int CreateCompression(out IntPtr context, int flags);        [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int Decompress(IntPtr context,byte[] input,int input_size,byte[] output,int output_size,ref int input_used,ref int output_used);        [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int Compress(IntPtr context,byte[] input,int input_size,byte[] output,int output_size,ref int input_used,ref int output_used,int compressionLevel);        [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int ResetDecompression(IntPtr context);        [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int ResetCompression(IntPtr context);        [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int DestroyDecompression(IntPtr context);        [DllImport("c:\\windows\\system32\\inetsrv\\gzip.dll", CharSet = CharSet.Auto)]
            private static extern int DestroyCompression(IntPtr context);        public TestGZip()
            {
                InitializeComponent();
                this.txtSource.Text = "BBA7021に関しては、都度DB検索せず、取得したデータに関してはクライアント側に保持し、DBアクセスを極力抑える。";
            }
            void Compress(Byte[] bytes)
            {            int totalLength = bytes.Length;
                String text = UTF8Encoding.UTF8.GetString(bytes);
                Byte[] buffer = new Byte[MAX_SIZE];            IntPtr contextHandle = IntPtr.Zero;            InitCompression();            CreateCompression(out contextHandle, 1);            int hResult = 0;
                int bufferSize = MAX_SIZE;
                MemoryStream newStream = new MemoryStream();
                do
                {
                    int outUsed = 0;
                    int inUsed = 0;                hResult = Compress(contextHandle, bytes, totalLength, buffer, bufferSize, ref inUsed, ref outUsed, 1);
                    if (0 != outUsed)
                    {
                        newStream.Write(buffer, 0, outUsed);
                    }
                    totalLength -= inUsed;
                } while (hResult == 0);            newStream.Flush();            ResetCompression(contextHandle);            Decompress(newStream.ToArray());
            }        void Decompress(Byte[] bytes)
            {
                MemoryStream decodeStream = new MemoryStream();
                int totalLength = bytes.Length;
                Byte[] buffer = new Byte[MAX_SIZE];
                IntPtr contextHandle = IntPtr.Zero;
                InitDecompression();
                CreateDecompression(out contextHandle, 1);
                int hResult = 0;
                int bufferSize = MAX_SIZE;
                do
                {
                    int outUsed = 0;
                    int inUsed = 0;                hResult = Decompress(contextHandle, bytes, totalLength, buffer, bufferSize, ref inUsed, ref outUsed);                if (0 != outUsed)
                        decodeStream.Write(buffer, 0, outUsed);                totalLength -= inUsed;
                }
                while (hResult == 0);
                decodeStream.Flush();
                decodeStream.Position = 0;
                ResetDecompression(contextHandle);
                this.txtDest.Text = Array2String(decodeStream.ToArray());
            }        private void cmdCompress_Click(object sender, EventArgs e)
            {
                String txtSource = this.txtSource.Text;
                Byte[] inDatas = String2Array(txtSource);
                Compress(inDatas);
            }        private Byte[] String2Array(String str)
            {
                return Encoding.Unicode.GetBytes(str);
            }        private String Array2String(Byte[] byts)
            {
                return Encoding.Unicode.GetString(byts);
            }
        }
    }
      

  11.   

    对api的猜测:
    CreateDecompression和CreateCompression两个参数,第一个context应该是个内存地址(指针),类似于一块画布,所有的加解压缩操作都在该画布上进行flags IIS的加解密分成1~10个等级
    然后到Decompress 和Compress函数~context 就是上面那个地址,所以是值传递~
    inBytes() 和input_size  就是传入的要加解压缩的字符流和字符流大小output() 和output_size 存放每一次加解压缩过程中得到的数据和程序员设置的缓冲区大小input_used和output_used 是每一次加解压缩过程操作的字符流的长度和结果长度~这样一想,哪个该是传入哪个传出,就很清楚了,从C#的声明也很容易看出~~~
      

  12.   

    我解决了问题(整个数组解压缩的,压缩的同样,没有调试),代码如下:Option Explicit
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
    Private Declare Function InitDecompression Lib "gzip.dll" () As Long
    Private Declare Function CreateDecompression Lib "gzip.dll" (ByRef context As Long, ByVal Flags As Long) As Long
    Private Declare Function DestroyDecompression Lib "gzip.dll" (ByRef context As Long) As Long
    Private Declare Function Decompress Lib "gzip.dll" (ByVal context As Long, inBytes As Any, ByVal input_size As Long, outBytes As Any, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long) As LongPrivate Const OFFSET As Long = &H8
    '解压缩数组
    Public Function UnCompressByte(ByteArray() As Byte) As Boolean
      
      Dim BufferSize  As Long
      Dim buffer()    As Byte
      Dim lReturn     As Long
      
      Dim outUsed     As Long
      Dim inUsed      As Long
      
      '创建解压缩后的缓存
      CopyMemory BufferSize, ByteArray(0), OFFSET
      BufferSize = BufferSize + (BufferSize * 0.01) + 12
      ReDim buffer(BufferSize) As Byte
      
      '创建解压缩进程
      Dim contextHandle As Long: InitDecompression
      CreateDecompression contextHandle, 1  '创建
      
      '解压缩数据
      lReturn = Decompress(ByVal contextHandle, ByteArray(0), UBound(ByteArray) + 1, buffer(0), BufferSize, inUsed, outUsed)
      
      DestroyDecompression contextHandle
      
      '删除重复的数据
      ReDim Preserve ByteArray(0 To outUsed - 1)
      CopyMemory ByteArray(0), buffer(0), outUsed
      
    End Function
      

  13.   

    运行环境?
    CopyMemory BufferSize, ByteArray(0), OFFSET--〉从源字符流地址拷贝8个字节的数据
    BufferSize = BufferSize + (BufferSize * 0.01) + 12--〉这个比例是固定的吗
    ReDim buffer(BufferSize) As Byte --〉我这边报内存不足。。
    你有测试能够压缩解压缩多大的字符流吗?
      

  14.   

    你有测试能够压缩解压缩多大的字符流吗?--我的意思是在测试压缩解压缩结果正确的情况下,效率上怎么样另外,也请贴出你的压缩函数代码如果直接这样子做的话~inUsed 岂不是没用了,对照一下.net的代码
      

  15.   

    多大就不知道了,我是处理起点的源码(gzip)的,压缩我没有写,原理一样。
    .net例子的是分段获取的,也不难实现:
    每次从ByteArray读取3××的字节,返回inUsed,下一次应该从inUsed位置读取3××字节吧。  '创建解压缩后的缓存 
      CopyMemory BufferSize, ByteArray(0), OFFSET 
      BufferSize = BufferSize + (BufferSize * 0.01) + 12 
      ReDim buffer(BufferSize) As Byte 上面是我参考zlib.dll处理zip时候设置的缓存大小设置的。
      

  16.   

    错了,是缓存的大小。自己用HEX编辑器看看就知道了。
      

  17.   


    ①zip前8byte是缓存大小?没听说过,呵呵,我这边vb6+sp5,你的那个缓存数据,我这边马上就报内存不足②恩~ api的声明好像是对了,。,今天先下班了③对于小文件,你的代码能正确解压缩出来么,方便的话,能贴出来你的代码不或者发给我?我这边都是自己先压缩字符串,然后再解压缩做测试
    ps:你那个贴先结了吧,另外,还想弄一下和zlib.dll加解压缩效率方面作比较的~
      

  18.   

    晕,竟然与我的文章有异曲同工之妙。
    http://blog.csdn.net/Modest/archive/2006/04/13/662072.aspx接分接分
      

  19.   

    我的代码
    Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
    Private Declare Function InitDecompression Lib "c:\windows\system32\inetsrv\gzip.dll" () As Long
    Private Declare Function CreateDecompression Lib "c:\windows\system32\inetsrv\gzip.dll" (ByRef context As Long, ByVal flags As Long) As Long
    Private Declare Function Decompress Lib "c:\windows\system32\inetsrv\gzip.dll" (ByVal context As Long, inBytes As Any, ByVal input_size As Long, outBytes As Any, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long) As Long
    Private Declare Function DestroyDecompression Lib "c:\windows\system32\inetsrv\gzip.dll" (ByRef context As Long) As LongPrivate Declare Function InitCompression Lib "c:\windows\system32\inetsrv\gzip.dll" () As Long
    Private Declare Function CreateCompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long, ByVal flags As Long) As Long
    Private Declare Function Compress Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByVal context As Long, inBytes As Any, ByVal input_size As Long, outBytes As Any, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long, ByVal compressionLevel As Long) As Long
    Private Declare Function DestroyCompression Lib "c:\\windows\\system32\\inetsrv\\gzip.dll" (ByRef context As Long) As LongPrivate Const MAX_BUF As Integer = 1024
    Private Const GZIP_LVL As Integer = 1Public Function UnCompressByte(ByteArray() As Byte) As Byte()    Dim orglength As Long
        orglength = UBound(ByteArray) + 1
        
        Dim buffer(MAX_BUF - 1) As Byte    ReDim result(0) As Byte
      
        Dim outUsed     As Long
        Dim inUsed      As Long
            
        outUsed = 0
        inUsed = 0
        
        InitDecompression
        Dim contextHandle As Long
        CreateDecompression contextHandle, GZIP_LVL
        
        Dim lRet    As Long
        Dim tmplength As Long
        Do
            lRet = Decompress(ByVal contextHandle, ByteArray(0), orglength, buffer(0), MAX_BUF, inUsed, outUsed)
            If outUsed <> 0 Then
                tmplength = UBound(result)
                ReDim Preserve result(tmplength + outUsed)
                Call ArrayCopy(buffer, result, 0, tmplength, outUsed)
                orglength = orglength - inUsed        End If    Loop While lRet = 0
        DestroyDecompression contextHandle
        UnCompressByte = result
      
    End Function
    Public Function CompressByte(ByteArray() As Byte) As Byte()    Dim orglength As Long
        orglength = UBound(ByteArray) + 1    Dim buffer(MAX_BUF - 1) As Byte    ReDim result(0) As Byte
      
        Dim outUsed     As Long
        Dim inUsed      As Long
            
        outUsed = 0
        inUsed = 0
        
        InitCompression
        
        Dim contextHandle As Long
        CreateCompression contextHandle, GZIP_LVL    Dim lRet    As Long
        Dim tmplength As Long
        Do        lRet = Compress(ByVal contextHandle, ByteArray(0), orglength, buffer(0), MAX_BUF, inUsed, outUsed, GZIP_LVL)
                           
            If outUsed <> 0 Then
                tmplength = UBound(result)
                ReDim Preserve result(tmplength + outUsed)
                Call ArrayCopy(buffer, result, 0, tmplength, outUsed)
                orglength = orglength - inUsed
                
            End If
            
        Loop While lRet = 0
        
        DestroyCompression contextHandle
        
        CompressByte = result
    End Function
    Public Function Byte2String(dataByt() As Byte) As String
        Byte2String = StrConv(dataByt, vbUnicode)
    End Function
    Public Function String2Byte(dataStr As String) As Byte()
        String2Byte = StrConv(dataStr, vbFromUnicode)
    End Function
    Public Function ArrayCopy(ByRef arrSource() As Byte, ByRef arrDestination() As Byte, Optional ByVal srcbeginPos As Long = 0, Optional ByVal destbeginPos As Long = 0, Optional ByVal length As Long = 0) As Boolean
        On Error GoTo errHandler
        ArrayCopy = True
        If length = 0 Then length = UBound(arrSource) + 1
        If srcbeginPos + length > UBound(arrSource) + 1 Then GoTo errHandler
        If destbeginPos + length > UBound(arrDestination) + 1 Then GoTo errHandler    CopyMemory arrDestination(destbeginPos), arrSource(srcbeginPos), length
        Exit Function
    errHandler:
        ArrayCopy = False
    End Function
    Option ExplicitPrivate Sub Command1_Click()
        Dim str As String
        str = "abcd1234"
        Dim bytes() As Byte
        bytes = String2Byte(str)
        
        Dim compBytes() As Byte
        compBytes = CompressByte(bytes)
        
        MsgBox Byte2String(UnCompressByte(compBytes))
        
    End Sub当GZIP_LVL=1 ~ 10之间取值时会有问题,我这边测试是这样子的
    1,2,3,5,7,9没有问题,4,6,10数据变多,而且这3个解压缩得到的数据竟然一样多,8就直接进入了CompressByte的死循环~谁了解的能解释一下么
      

  20.   

    ①当测试字符串的长度变大,GZIP_LVL=9时,压缩率变得很好,但是解压缩出来的结果会有问题~~~~但是,把MAX_BUF缓冲变大,竟然也能过得去~   分段压缩竟然还与缓冲区有关
    想不通了②
    Private Declare Function lstrlenW Lib "kernel32" (ByVal lpString As Long) As Long
    Public Function TrimNull(startstr As String) As String
       TrimNull = Left(startstr, lstrlenW(StrPtr(startstr)))
    End Function
    解压缩出来的字符串最后会有一个null字符。。要去掉
      

  21.   

    希望了解IIS,gzip的伙计,帮忙解释一下~ 是不是iis的gzip有什么限制,还有他的level~
      

  22.   

    没有问题啊,呵呵,留下你的mail~
      

  23.   

    我的代码都在上面36楼+38楼,都贴出来的了,另外36和38的测试情况都测试一下~~~~  .net的也可以一起发给你看看~
      

  24.   

    靠 忘记留mail了taoxu.wei#163.com
      

  25.   


    mail 已发,呵呵 帮忙看看~
      

  26.   


    影子,呵呵,现在公司里面白天能上CSDN了~~~抢分咯
      

  27.   

    http://www.zlib.net/
    到这里下载库文件吧,zlib支持gzip压缩。
    我测试了一下,用你的代码压缩,然后用zlib解压缩可正常得到结果。
      

  28.   

    这个东西我也知道~ 我就是想试试gzip,呵呵,,,,你说的测试,是多大的数据? level是几的?
      

  29.   

    Option Explicit
      Public WithEvents owinhttp As WinHttp.WinHttpRequest
    Public Function StartWork() As Boolean
      Dim FileNo As Integer
      With owinhttp
        .SetRequestHeader "accept-encoding", "gzip,deflate"
        Call .Open("GET", "http://www.sina.com.cn/", True)     .Option(WinHttpRequestOption_UserAgentString) = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"
        
        .SetRequestHeader "accept", "*/*"
        .SetRequestHeader "accept-language", "en-us"
        .SetRequestHeader "accept-encoding", "gzip,deflate"
        .SetRequestHeader "connection", "Keep-Alive"
        .SetRequestHeader "cache-control", "no-cache"
        .SetTimeouts 90000, 15000, 80000, 90000
        owinhttp.Send      Do While Not .WaitForResponse(1)
            DoEvents
          Loop
       Dim strContent As String   .ResponseText  StartWork = True
    End Function
      

  30.   

    用zlib.dll实现了最大65535个字符的压缩解压缩代码,好象低版本的zlib.dll的限制?   再多试试~~
    希望还是了解IIS GZIP的朋友帮帮忙,指点一下
      

  31.   

    ZLIB的代码贴错了地方,贴到这里去了...http://topic.csdn.net/u/20080518/15/810e9a05-c61e-4cca-a2f0-2a1b12f11176.html?seed=1954492383
      

  32.   

    我的,gzip.dll 的版本号为:6.0.3790.3959 只包括压缩数据所用的函数(InitCompression、 CreateCompression 、 Compress 、DestroyCompression) ;解压缩函数不存在(InitDecompression、CreateDecompression、Decompress、DestroyDecompression )声名后找不到入口点。请问哪个朋友解决了这个问题,或有其它GZIP.DLL版的,发给我一份。我在这先谢谢了,我的QQ:69798459 我的EMAIL:[email protected]
      

  33.   

    gzip.dll 的版本号为:6.0.2600.2180 存在上函数(InitCompression、 CreateCompression 、 Compress 、DestroyCompression、InitDecompression、CreateDecompression、Decompress、DestroyDecompression )下载地址:http://www.dllxia.cn/soft/7/2007/dll_922.html。
      

  34.   

    http://topic.csdn.net/u/20080518/15/810e9a05-c61e-4cca-a2f0-2a1b12f11176.html?seed=1954492383#top
    yinweihong 发表于:2008-05-23 23:52:3654楼 得分:0 
    好了,ZLIB的来了,贴代码,星期天晚上回来揭贴,理论上只要你memory足够大,可以压缩解压缩4GB的字符串 
    本地测试,18.8 MB (19,815,840 字节)大小的字符串,得到压缩后字节流大小94.5 KB (96,784 字节) 
    压缩和计算CRC时间 
    incrc = 0x88BD9A06 
    0.6003s 
    解压缩和计算解压缩后的CRC的时间,用的是未知原字节流大小,先计算推测解压缩需要的缓存区大小,然后再解压缩 
    如果已知原字节流长度再解压缩的话,更快 
    outcrc = 0x88BD9A06 
    0.4434s 压缩后和还原后的CRC32 一致,说明得到的字节流正确 模块: 
    Option Explicit 
    Private Declare Function compressAPI Lib "ZLibWAPI.dll" Alias "compress" (ByRef dest As Any, ByRef destLen As Long, ByRef Source As Any, ByVal sourceLen As Long) As Long 
    Private Declare Function compressBound Lib "ZLibWAPI.dll" (ByVal sourceLen As Long) As Long 
    Private Declare Function uncompressAPI Lib "ZLibWAPI.dll" Alias "uncompress" (ByRef dest As Any, ByRef destLen As Long, ByRef Source As Any, ByVal sourceLen As Long) As Long 
    Private Declare Function adler32 Lib "ZLibWAPI.dll" (ByVal adler As Long, ByRef buf As Any, ByVal length As Long) As Long 
    Private Declare Function crc32 Lib "ZLibWAPI.dll" (ByVal crc As Long, ByRef buf As Any, ByVal length As Long) As Long 
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal length As Long) 
    Public Const Z_OK As Long = &H0 
    Public Const Z_ERROR As Long = -&H1 
    Public Const Z_BUF_ERROR As Long = -&H5 
    Private Sub Main() 
        Form1.Show 
    End Sub 
    Public Function compress(ByRef inBytes() As Byte, ByVal BufferSize As Long, ByRef incrc As Long, ByRef outBytes() As Byte) As Long 
        If BufferSize > 0 Then 
            incrc = crc32(crc32(0, ByVal 0&, 0), inBytes(0), BufferSize) 
        
            Dim outLength As Long 
            outLength = compressBound(BufferSize) 
        
            ReDim outBytes(0 To outLength - 1) As Byte 
        
            Dim ret As Long 
            ret = compressAPI(outBytes(0), outLength, inBytes(0), BufferSize) 
            Erase inBytes 
            If ret = Z_OK Then 
                ReDim Preserve outBytes(0 To outLength - 1) 
                compress = ret 
            Else 
                compress = Z_ERROR 
            End If 
        End If 
    End Function 
    Public Function uncompress(ByRef inBytes() As Byte, ByVal BufferSize As Long, ByRef outcrc As Long, ByRef outBytes() As Byte) As Long 
        ReDim outBytes(0 To (BufferSize - 1)) As Byte 
        Dim ret As Long 
        ret = uncompressAPI(outBytes(0), BufferSize, inBytes(0), UBound(inBytes) + 1) 
        Erase inBytes 
        If (ret = Z_OK) Then 
            ReDim Preserve outBytes(0 To (BufferSize - 1)) 
            outcrc = crc32(crc32(0, ByVal 0&, 0), outBytes(0), BufferSize) 
            uncompress = Z_OK 
        Else 
            uncompress = Z_ERROR 
        End If 
    End Function 
    Public Function uncompressEx(ByRef inBytes() As Byte, ByRef outcrc As Long, ByRef outBytes() As Byte, ByVal multiple As Integer) As Long 
        Dim inLength As Long 
        inLength = UBound(inBytes) + 1 
        Dim gzSize As Long 
        gzSize = multiple * inLength 
        Dim outBuffer As Long 
        Dim ret As Long 
        Do 
            outBuffer = gzSize 
            ReDim outBytes(0 To (outBuffer - 1)) As Byte 
            ret = uncompressAPI(outBytes(0), outBuffer, inBytes(0), inLength) 
            gzSize = gzSize + inLength 
        Loop While ret = Z_BUF_ERROR 
        Erase inBytes 
        If (ret = Z_OK) Then 
            ReDim Preserve outBytes(0 To (outBuffer - 1)) 
            outcrc = crc32(crc32(0, ByVal 0&, 0), outBytes(0), outBuffer) 
            uncompressEx = Z_OK 
        Else 
            uncompressEx = Z_ERROR 
        End If 
    End Function 
    Public Function fileToBuffer(ByVal inFile As String, ByRef outBuffer() As Byte) As Long 
        ' make sure file exists 
        If (Not fileExist(inFile)) Then Exit Function 
        Dim FNum As Integer 
        FNum = FreeFile() 
        
        Open inFile For Binary Access Read Lock Write As #FNum 
        ReDim refBuffer(0 To (LOF(FNum) - 1)) As Byte ' allocate buffer 
        Get #FNum, , refBuffer() ' read file data into buffer 
        Close #FNum 
        
        ' return array 
        outBuffer = refBuffer 
        fileToBuffer = UBound(refBuffer) + 1 
    End Function 
    Public Function flushToFile(ByVal inFile As String, ByRef outBuffer() As Byte) As Long 
        If (fileExist(inFile)) Then Kill inFile 
        Open inFile For Output As #1: Close #1 'create empty file 
        
        Dim FNum As Integer 
        FNum = FreeFile() ' get a free file handle 
        Open inFile For Binary Access Write As #FNum 
        Put #FNum, , outBuffer() 'flush buffer to local file 
        Close #FNum 
    End Function 
    Private Sub ArrayCopy(ByRef arrSrc() As Byte, ByVal srcPos As Long, ByRef arrDest() As Byte, ByVal destPos As Long, ByVal length As Long) 
        'make sure srcPos >= LBound(arrSrc) and srcPos + length < UBound(arrSrc) +1 
        'make sure destPos >= LBound(arrDest) and destPos + length < UBound(arrDest) +1 
        CopyMemory arrDest(destPos), arrSrc(srcPos), length 
    End Sub 
    Private Function WriteBuffer(buffer() As Byte, ByVal srcPos As Long, ByVal length As Long) As Byte() 
        ReDim retBuffer(length - 1) As Byte 
        CopyMemory retBuffer(0), buffer(srcPos), length 
        WriteBuffer = retBuffer 
    End Function 
    Private Function fileExist(ByRef inFile As String) As Boolean 
        On Error Resume Next 
        fileExist = CBool(FileLen(inFile) + 1) 
    End Function 
    时间类 
    Option Explicit Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As Currency) As Long 
    Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As Currency) As Long Private m_Frequency  As Currency 
    Private m_Start      As Currency 
    Private m_Now        As Currency 
    Private m_Available  As Boolean Private Sub Class_Initialize() 
        m_Available = (QueryPerformanceFrequency(m_Frequency) <> 0) 
        If Not m_Available Then 
            Debug.Print "Performance Counter not available" 
        End If 
    End Sub 
    Friend Function Elapsed() As Double 
        QueryPerformanceCounter m_Now 
        If m_Available Then 
            Elapsed = 1000 * (m_Now - m_Start) / m_Frequency 
        End If 
    End Function 
    Friend Sub Reset() 
        QueryPerformanceCounter m_Start 
    End Sub 
    窗体 
    Option Explicit Private Sub Command1_Click() 
        Dim inFile As String 
        inFile = App.Path & "\inBytes.in" 
        Dim tmpFile As String 
        tmpFile = App.Path & "\Bytes.tmp" 
        Dim outFile As String 
        outFile = App.Path & "\outBytes.out"     Dim origSize As Long, inBytes() As Byte 
        Dim ct1 As New clsTiming 
        ct1.Reset 
        origSize = fileToBuffer(inFile, inBytes())     Dim incrc As Long, outBytes() As Byte 
        If Z_OK = compress(inBytes, origSize, incrc, outBytes) Then 
            flushToFile tmpFile, outBytes 
            Debug.Print "incrc = 0x" & Hex(incrc) 
        End If 
        Erase inBytes 
        Debug.Print Format$(ct1.Elapsed / 1000, "0.0000") & "s" 
        
        Dim Ct2 As New clsTiming 
        Ct2.Reset 
        Dim outcrc As Long, origBytes() As Byte 
    '已知原字节流大小解压缩 
    '    If Z_OK = uncompress(outBytes, origSize, outcrc, origBytes) Then 
    '        Debug.Print "outcrc = 0x" & Hex(outcrc) 
    '    End If 
    '未知原字节流大小解压缩 
        If Z_OK = uncompressEx(outBytes, outcrc, origBytes, 1024) Then 
            Debug.Print "outcrc = 0x" & Hex(outcrc) 
        End If 
        Erase outBytes 
        flushToFile outFile, origBytes 
        Erase origBytes 
        Debug.Print Format$(Ct2.Elapsed / 1000, "0.0000") & "s" 
    End Sub 
     
    yinweihong 发表于:2008-05-23 23:54:0255楼 得分:0 
    转贴的话麻烦注明一下,谢谢 
    ZLibWAPI.dll 这个文件就是winImage那里下的 好帖子做个标记
    不知道楼主解决问题没有,虽然结贴了…… 
      

  35.   

    Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    Private Declare Function InitDecompression Lib "gzip.dll" () As Long
    Private Declare Function CreateDecompression Lib "gzip.dll" (ByRef context As Long, ByVal Flags As Long) As Long
    Private Declare Function DestroyDecompression Lib "gzip.dll" (ByRef context As Long) As Long
    Private Declare Function Decompress Lib "gzip.dll" (ByVal context As Long, inBytes As Any, ByVal input_size As Long, outBytes As Any, ByVal output_size As Long, ByRef input_used As Long, ByRef output_used As Long) As Long
    Private Const OFFSET As Long = &H8''----------------------------------------------
    ''解压缩gzip
    ''----------------------------------------------
    Public Sub UnCompressByte(ByteArray() As Byte)
    Dim bufferSize As Long
    Dim buffer() As Byte
    Dim lReturn As Long
    Dim outUsed As Long
    Dim inUsed As Long
    '创建解压缩后的缓存
    CopyMemory bufferSize, ByteArray(0), OFFSET
    bufferSize = bufferSize + (bufferSize * 0.01) + 12
    ReDim buffer(bufferSize) As Byte
    '创建解压缩进程
    Dim contextHandle As Long: InitDecompression
    CreateDecompression contextHandle, 1 '创建
    '解压缩数据
    lReturn = Decompress(ByVal contextHandle, ByteArray(0), UBound(ByteArray) + 1, buffer(0), bufferSize, inUsed, outUsed)
    DestroyDecompression contextHandle
    '删除重复的数据
    ReDim Preserve ByteArray(0 To outUsed - 1)
    CopyMemory ByteArray(0), buffer(0), outUsed
    End Sub这个解压没问题,压缩死活整不出来