讲给初学者:浅析字典压缩方式

来源:互联网 发布:帝国cms调用栏目别名 编辑:程序博客网 时间:2024/05/21 08:46
对于磁盘来说文件被以二进制的方式存储在介质中,所以,对于文件的压缩实际上就是对每一个二进制流的压缩。那么如何实现压缩呢?我们举一个例子,假如有一个二进制流:11111111 00000000 10101010 01010101,它所占有的存储空间为4字节(每一字节有八位二进制码),如果对其实施压缩,我们最直观的想法即为代替(这也是字典压缩的根本)即用一个较少位数的符号代替原来的符号已达到减少存储空间的目的,这里我们使用 11110000 来代替以上提到的字符串,并且我们需要用一个在文件中出现频率较低的字节符号作为标记符来指示其后面一个字节为压缩字节,这里我们使用空字节来作为标记字节,那么以上二进制流在被压缩后就会变为 00000000 11110000。这样,例子中的二进制流就变为了2字节,长度变为了原来的 1/2 达到了压缩的目的。
这里我们使用 VB 来写一个简单的例子:
Public Function SimpleCompress(arrbytes() As ByteByVal _
sSngBytes 
As StringByVal sKeyBytes As String, arrDes() As ByteAs Double
    
On Error GoTo CompressEnd
        SimpleCompress 
= -1
        
Dim sSrcBytes As String, j As Long, lenSrc As Long
        sSrcBytes 
= "": j = 0
        
For j = LBound(arrbytes) To UBound(arrbytes)
            
If arrbytes(j) < 10 Then
                sSrcBytes 
= sSrcBytes & "00" & arrbytes(j)
            
ElseIf arrbytes(j) > 9 And arrbytes(j) < 100 Then
                sSrcBytes 
= sSrcBytes & "0" & arrbytes(j)
            
Else
                sSrcBytes 
= sSrcBytes & arrbytes(j)
            
End If
        
Next j
        lenSrc 
= Len(sSrcBytes) / 3
        
Do Until sSrcBytes = Replace(sSrcBytes, sSngBytes, sKeyBytes)
            sSrcBytes 
= Replace(sSrcBytes, sSngBytes, sKeyBytes)
        
Loop
        
ReDim arrDes(1 To Len(sSrcBytes) / 3As Byte
        
For j = 1 To Len(sSrcBytes) / 3
            arrDes(j) 
= CByte(Mid$(sSrcBytes, j * 3 - 23))
        
Next j
        SimpleCompress 
= (Len(sSrcBytes) / 3/ lenSrc
CompressEnd:
End Function
(*)这里,我们使用了一个字符串变量来组合所有的字节,若字节流较大,可能出现死循环或执行速度较慢的情况,所以本例只作教学,不作为实例。
(**)该函数正确执行后会返回压缩比,若出现错误则返回值为-1。
接下来,我们假定一个数据流(087088003024012023)、一组字典关键字(要替换的关键字088003024,标志000001)并调用以上函数对数据流进行压缩:
Sub Main()
    
Dim a(1 To 6As Byte, b As String, c As String, d() As Byte
    a(
1= 87: a(2= 88: a(3= 3
    a(
4= 24: a(5= 12: a(6= 23
    b 
= "088003024": c = "000001"
    
Dim e As Double
    e 
= SimpleCompress(a, b, c, d)
    
If e <> -1 Then
        
MsgBox "压缩比: " & FormatNumber(e * 1002, vbTrue) & "%"
    
End If
End Sub
结果显示:“压缩比: 83.33%”说明数据流得到了压缩。
字典压缩方法的原理及实现都已经介绍完毕了,其实这种方法的应用也在我们身边随处可见,像我们使用的Zip压缩,其算法的一部分就是这样的代替缺位,同样的实例也有采用Zip算法的PNG图片压缩算法,而且,事实也表明,在文档中重复出现的字、词、句子或是图片中反复出现的颜色以及程序源码文件中的关键字都是可以代替缺位压缩的对象,如果我们有一本或可以动态生成一本足够强大的字典文件,那么我们的文件压缩比将越来越趋近于0。
原创粉丝点击