翻箱倒柜,在这里找到
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 这两函数欢迎接分~~~!!!!
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 这两函数欢迎接分~~~!!!!
解决方案 »
- 能用vb截取到别的程序中某个窗体在每次出现时其内的文本框内容?急
- 关于用vb实现票据套打的问题?
- 我做了个vb+access2000 得小系统 访问数据库用得ado 发布时需用户安装access嘛 ?
- ================请问如何截取数据库中数字字段的整数部分?=================
- 关于mshflexgrid的问题
- 怎样用vb生成表?
- 连接数据库后的问题,在线等待......
- Runtime error的错误
- 关于sql查询
- 我想让.ocx 文件和.exe文件合并为一个文件,怎么办?
- 怎么在ComboBox的下拉列表中加入树形控件?
- 知道如何最快的构造出图形异型窗体吗,我来告诉你,不服你可以写个更高效的------纯粹活跃下群里的气氛。
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
顶!!
没有关系,找不到DLL会报错的~
你没试吧,这样子context 上会报类型不一致,数组或用户定义类型没指定的compile errorto : GZip.dll原来是字符串解/压缩函数! 为IIS提供压缩传输的组件
安装的是IIS5标下。。顶下。。分。。顺便接下。。
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
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
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);
}
}
}
CreateDecompression和CreateCompression两个参数,第一个context应该是个内存地址(指针),类似于一块画布,所有的加解压缩操作都在该画布上进行flags IIS的加解密分成1~10个等级
然后到Decompress 和Compress函数~context 就是上面那个地址,所以是值传递~
inBytes() 和input_size 就是传入的要加解压缩的字符流和字符流大小output() 和output_size 存放每一次加解压缩过程中得到的数据和程序员设置的缓冲区大小input_used和output_used 是每一次加解压缩过程操作的字符流的长度和结果长度~这样一想,哪个该是传入哪个传出,就很清楚了,从C#的声明也很容易看出~~~
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
CopyMemory BufferSize, ByteArray(0), OFFSET--〉从源字符流地址拷贝8个字节的数据
BufferSize = BufferSize + (BufferSize * 0.01) + 12--〉这个比例是固定的吗
ReDim buffer(BufferSize) As Byte --〉我这边报内存不足。。
你有测试能够压缩解压缩多大的字符流吗?
.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时候设置的缓存大小设置的。
①zip前8byte是缓存大小?没听说过,呵呵,我这边vb6+sp5,你的那个缓存数据,我这边马上就报内存不足②恩~ api的声明好像是对了,。,今天先下班了③对于小文件,你的代码能正确解压缩出来么,方便的话,能贴出来你的代码不或者发给我?我这边都是自己先压缩字符串,然后再解压缩做测试
ps:你那个贴先结了吧,另外,还想弄一下和zlib.dll加解压缩效率方面作比较的~
http://blog.csdn.net/Modest/archive/2006/04/13/662072.aspx接分接分
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的死循环~谁了解的能解释一下么
想不通了②
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字符。。要去掉
mail 已发,呵呵 帮忙看看~
影子,呵呵,现在公司里面白天能上CSDN了~~~抢分咯
到这里下载库文件吧,zlib支持gzip压缩。
我测试了一下,用你的代码压缩,然后用zlib解压缩可正常得到结果。
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
希望还是了解IIS GZIP的朋友帮帮忙,指点一下
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那里下的 好帖子做个标记
不知道楼主解决问题没有,虽然结贴了……
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这个解压没问题,压缩死活整不出来