龙空技术网

VBScript中的LZW压缩算法

王二辉 76

前言:

目前朋友们对“jslzw压缩算法”大体比较着重,看官们都想要分析一些“jslzw压缩算法”的相关内容。那么小编在网摘上收集了一些关于“jslzw压缩算法””的相关文章,希望你们能喜欢,各位老铁们一起来了解一下吧!

LZW算法

LZW算法是一种压缩技术,不会导致数据丢失。它构建了一个用于压缩的代码和值的字典。字典不与压缩文件一起存储,并在压缩后丢弃。在解压缩期间,字典从压缩数据重建。

LZW算法的功能如下:

初始化字典以包含所有长度为1的字符串

找到匹配当前输入的字典中最长的字符串

输出该匹配输入的字典代码

将下一个字符从输入添加到匹配的输入字符串,并将其作为新的字典值添加新的代码

转到步骤2

代码和如何使用

下面的代码是VBScript中的LZW算法的一个示例实现,并且易于移植到VBA中。功能是LZWCompress和LZWUncompress,并以文件路径为参数。

字典被初始化为8位值的全范围,每个键使用16位。达到65535个键之后,该字典将重新初始化,这样我就可以轻松实现,尽管这也意味着它不像压缩一样。

对于大型Access数据库,我的测试显示了86%的压缩级别,而使用LZMA算法的“超级”级别压缩使用7zip压缩率为93%。

我的算法实现也很慢,因为我一次读取文件1个字节。再次,这是由于易于实施。

展开| 选择| 包裹| 行号

选项显式

Const ForReading = 1,ForWriting = 2,ForAppending = 8

功能LZWCompress(strPath)

Dim oFS,oFRead,oFWrite,oDict,strNext,strCurrent,intMaxCode,i

设置oDict = CreateObject(“Scripting.Dictionary”)

设置oFS = CreateObject(“Scripting.FileSystemObject”)

设置oFRead = oFS.OpenTextFile(strPath,ForReading)

设置oFWrite = oFS.OpenTextFile(strPath&“.lzw”,ForWriting,True)

设置oFS =没有

intMaxCode = 255

strCurrent = oFRead.Read(1)

对于i = 0到255

oDict.Add Chr(i),i

下一个

直到oFRead.AtEndOfStream

strNext = oFRead.Read(1)

如果oDict.Exists(strCurrent&strNext)那么

strCurrent = strCurrent&strNext

其他

oFWrite.Write(Chr(CByte(oDict.Item(strCurrent)\ 256))&Chr(CByte(oDict.Item(strCurrent)Mod 256)))

intMaxCode = intMaxCode + 1

oDict.Add strCurrent&strNext,intMaxCode

strCurrent = strNext

如果intMaxCode = 65535那么

intMaxCode = 255

oDict.RemoveAll

对于i = 0到255

oDict.Add Chr(i),i

下一个

万一

万一

循环

oFWrite.Write(Chr(CByte(oDict.Item(strCurrent)\ 256))&Chr(CByte(oDict.Item(strCurrent)Mod 256)))

oFRead.Close

oFWrite.Close

设置oFRead =没有

设置oFWrite =没有

设置oDict =没有

结束功能

功能LZWUncompress(strPath)

Dim oFS,oFRead,oFWrite,oDict,intNext,intCurrent,intMaxCode,i,strNext

设置oDict = CreateObject(“Scripting.Dictionary”)

设置oFS = CreateObject(“Scripting.FileSystemObject”)

设置oFRead = oFS.OpenTextFile(strPath,ForReading)

设置oFWrite = oFS.OpenTextFile(strPath&“.unc”,ForWriting,True)

设置oFS =没有

intMaxCode = 255

strNext = oFRead.Read(2)

intCurrent = 0

对于i = 1到Len(strNext)

intCurrent = intCurrent + 256 ^(Len(strNext) - i)* Asc(Mid(strNext,i,1))

下一个

对于i = 0到255

oDict.Add i,Chr(i)

下一个

直到oFRead.AtEndOfStream

oFWrite.Write(oDict.Item(intCurrent))

intMaxCode = intMaxCode + 1

strNext = oFRead.Read(2)

intNext = 0

对于i = 1到Len(strNext)

intNext = intNext + 256 ^(Len(strNext) - i)* Asc(Mid(strNext,i,1))

下一个

如果oDict.Exists(intNext)然后

oDict.Add intMaxCode,oDict.Item(intCurrent)&Left(oDict.Item(intNext),1)

其他

oDict.Add intMaxCode,oDict.Item(intCurrent)&Left(oDict.Item(intCurrent),1)

万一

如果intMaxCode = 65535那么

intMaxCode = 255

oDict.RemoveAll

对于i = 0到255

oDict.Add i,Chr(i)

下一个

万一

intCurrent = intNext

循环

oFWrite.Write(oDict.Item(intCurrent))

oFRead.Close

oFWrite.Close

设置oFRead =没有

设置oFWrite =没有

设置oDict =没有

结束功能

标签: #jslzw压缩算法 #lzw算法属于