zlib
 
使用Deflate算法的无损数据压缩库未被专利所抵制。

网址:http://www.zlib.net
支持平台:Win32,Linux,DOS
标题包括:zlib.bi
标题版本:1.2.8
示例:在例子/压缩/

例子

基于zlib的PNG保存和加载代码:http://www.freebasic.net/forum/viewtopic.php?t=3936

内存中压缩示例:
''Zlib压缩/解压缩示例,由yetifoot

#include once "zlib.bi"

Dim As Integer errlev

''这是我们的测试数据的大小(以字节为单位)。
Dim As Integer src_len = 100000

Print "ZLib测试 - 版本" & *zlibVersion()
Print
Print "测试数据大小:" & src_len & "字节。" 

''压缩数据的目标缓冲区的大小由...计算
''compressBound函数。
Dim As Integer dest_len = compressBound(src_len)

''赋值我们需要的内存
Dim As UByte Ptr src = Allocate(src_len)
Dim As UByte Ptr dest = Allocate(dest_len)

''使用随机的,仍然可压缩的数据填充src缓冲区。
For i As Integer = 0 To src_len - 1
    src[i] = Rnd * 4
Next

''存储crc32校验和的输入数据,所以我们可以检查一下
''解压缩已经起作用。
Dim As UInteger crc = crc32(0, src, src_len)

''执行压缩。dest_len作为其地址传递,因为什么时候
''该函数返回它将包含压缩数据的大小。
errlev = compress(dest, @dest_len, src, src_len)
If errlev <> 0 Then
    ''如果函数返回0以外的值,则发生错误。
    Print "****压缩代码时出错" & errlev & "****"
End If
Print "压缩为:" & dest_len & "字节。"

''注意:在正常使用程序中,您将存储src_len,以便
''能够解释压缩输出大小。不过在这个例子中我们可以
''只要把它留在src_len。对于dest_len也是如此,这是压缩的
''数据大小。

''在我们解压缩之前擦拭src缓冲区,以便我们可以检查
''减压已经起作用。
For i As Integer = 0 To src_len - 1
    src[i] = 0
Next

''执行解压缩。这次我们将数据解压缩回src。
''src_len作为其地址传递,因为什么时候
''该函数返回它将包含未压缩数据的大小。
errlev = uncompress(src, @src_len, dest, dest_len)
If errlev <> 0 Then
    ''如果函数返回0以外的值,则发生错误。
    Print "****解压缩时出错 - 代码" & errlev & "****"
End If
Print "未压缩为:" & src_len & "字节。"

''确保未压缩数据的校验和与我们的原始数据一致。
If crc <> crc32(0, src, src_len) Then
    Print "crc32 checksum:FAILED"
Else
    Print "crc32 checksum:PASSED"
End If

''释放测试中使用的缓冲液。
Deallocate(src)
Deallocate(dest)

Print
Print "按任意键结束。.."
Sleep