前言:
目前朋友们对“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 =没有
结束功能