讲给初学者:浅析字典压缩方式
来源:互联网 发布:帝国cms调用栏目别名 编辑:程序博客网 时间:2024/05/21 08:46
对于磁盘来说文件被以二进制的方式存储在介质中,所以,对于文件的压缩实际上就是对每一个二进制流的压缩。那么如何实现压缩呢?我们举一个例子,假如有一个二进制流:11111111 00000000 10101010 01010101,它所占有的存储空间为4字节(每一字节有八位二进制码),如果对其实施压缩,我们最直观的想法即为代替(这也是字典压缩的根本)即用一个较少位数的符号代替原来的符号已达到减少存储空间的目的,这里我们使用 11110000 来代替以上提到的字符串,并且我们需要用一个在文件中出现频率较低的字节符号作为标记符来指示其后面一个字节为压缩字节,这里我们使用空字节来作为标记字节,那么以上二进制流在被压缩后就会变为 00000000 11110000。这样,例子中的二进制流就变为了2字节,长度变为了原来的 1/2 达到了压缩的目的。
这里我们使用 VB 来写一个简单的例子:
(*)这里,我们使用了一个字符串变量来组合所有的字节,若字节流较大,可能出现死循环或执行速度较慢的情况,所以本例只作教学,不作为实例。
(**)该函数正确执行后会返回压缩比,若出现错误则返回值为-1。
接下来,我们假定一个数据流(087088003024012023)、一组字典关键字(要替换的关键字088003024,标志000001)并调用以上函数对数据流进行压缩:
结果显示:“压缩比: 83.33%”说明数据流得到了压缩。
字典压缩方法的原理及实现都已经介绍完毕了,其实这种方法的应用也在我们身边随处可见,像我们使用的Zip压缩,其算法的一部分就是这样的代替缺位,同样的实例也有采用Zip算法的PNG图片压缩算法,而且,事实也表明,在文档中重复出现的字、词、句子或是图片中反复出现的颜色以及程序源码文件中的关键字都是可以代替缺位压缩的对象,如果我们有一本或可以动态生成一本足够强大的字典文件,那么我们的文件压缩比将越来越趋近于0。
这里我们使用 VB 来写一个简单的例子:
Public Function SimpleCompress(arrbytes() As Byte, ByVal _
sSngBytes As String, ByVal sKeyBytes As String, arrDes() As Byte) As 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) / 3) As Byte
For j = 1 To Len(sSrcBytes) / 3
arrDes(j) = CByte(Mid$(sSrcBytes, j * 3 - 2, 3))
Next j
SimpleCompress = (Len(sSrcBytes) / 3) / lenSrc
CompressEnd:
End Function
sSngBytes As String, ByVal sKeyBytes As String, arrDes() As Byte) As 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) / 3) As Byte
For j = 1 To Len(sSrcBytes) / 3
arrDes(j) = CByte(Mid$(sSrcBytes, j * 3 - 2, 3))
Next j
SimpleCompress = (Len(sSrcBytes) / 3) / lenSrc
CompressEnd:
End Function
(**)该函数正确执行后会返回压缩比,若出现错误则返回值为-1。
接下来,我们假定一个数据流(087088003024012023)、一组字典关键字(要替换的关键字088003024,标志000001)并调用以上函数对数据流进行压缩:
Sub Main()
Dim a(1 To 6) As 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 * 100, 2, vbTrue) & "%"
End If
End Sub
Dim a(1 To 6) As 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 * 100, 2, vbTrue) & "%"
End If
End Sub
字典压缩方法的原理及实现都已经介绍完毕了,其实这种方法的应用也在我们身边随处可见,像我们使用的Zip压缩,其算法的一部分就是这样的代替缺位,同样的实例也有采用Zip算法的PNG图片压缩算法,而且,事实也表明,在文档中重复出现的字、词、句子或是图片中反复出现的颜色以及程序源码文件中的关键字都是可以代替缺位压缩的对象,如果我们有一本或可以动态生成一本足够强大的字典文件,那么我们的文件压缩比将越来越趋近于0。
- 讲给初学者:浅析字典压缩方式
- 给日语 初学者, 汉字, 假名 , 女声 发音, 字典,
- Oracle 数据字典浅析
- 字典压缩编码器
- 给 XML 初学者
- 给CVS初学者
- 给初学者的经验
- 给软件开发初学者
- 给软件开发初学者
- 给ARM初学者
- 给初学者一封信
- 给AVR初学者
- 【转载】给初学者一封信
- 给初学者一封信 【转】
- 给初学者的忠告
- 给初学者的建议
- 给初学者一封信
- 给软件开发初学者
- VC++中的图像类型转换--使用开源CxImage类库
- Some good motto I need to remember
- 初学MYSQL存储过程
- Love&Community-11月11日微软(北京).NET俱乐部第十二次沙龙
- AJAX+jsp无刷新验证码实例
- 讲给初学者:浅析字典压缩方式
- smarty代码
- 此情可待成追忆 只是当时已惘然
- 在VMWare5.5.2上安装ubuntu6.10
- 关于PHP5的短标记
- 在QForm平台上构建质量管理系统
- Visual Assist X 功能一览
- 本blog今晨搬家
- Google Adsense,你今天被封杀了吗?