信源作业四:LZO算法的压缩与解压技术

LZO算法简介

LZO算法说明

LZO 是一个用 ANSI C 语言编写的无损压缩库。他能够提供非常快速的压缩和解压功能。解压并不需要内存的支持。即使使用非常大的压缩比例进行缓慢压缩出的数据,依然能够非常快速的解压。LZO 遵循 GNU 的 GPL 使用许可。

介绍

LZO 非常适合进行数据的实时压缩解压处理,这就是说他更关心操作速度,而不是压缩比例。

LZO 使用 ANSI C 语言编写,并且压缩后的数据也被设计为可以跨平台使用的格式。

LZO 拥有如下的特点:

解压速度很快,并且很简单;
解压时不需要内存支持;
压缩的速度还不错;
压缩时只需要 64 KiB 的内存支持;
压缩比例可以根据需要调节,而这并不影响解压的效率,提高压缩比例自然会降低压缩速度;
压缩包含了很多的压缩级别,提供很多选择;
提供只需要 8 KiB 内存支持的压缩级别;
提供线程安全;
提供无损压缩;
LZO提供多重压缩,和复原解压;

LZO算法的编解码器

先下载好lzo-2.10,目录如下所示:

  • 列表内容
    lzo-2.10
    asm
    autoconf
    doc
    examples
    include
    lzotest
    minilzo
    src
    tests
    util

其中,lzoconf.h是LZO数据压缩库的配置,lzodefs.h是对体系结构、操作系统和编译器特定的定义,minilzo.h是迷你LZO实时数据压缩库的子集。minilzo.c是C语言版本的迷你LZO实时数据压缩库的子集,testmini.c是minilzo的测试文件。

一、选择待压缩文件按钮

void CcompressDlg::OnBnClickedButton3()  
{  
    // TODO: 在此添加控件通知处理程序代码  
    CString strFile = _T("");  

    CFileDialog    dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.cfg)|*.cfg|All Files (*.*)|*.*||"), NULL);  

    if (dlgFile.DoModal())  
    {  
        strFile = dlgFile.GetPathName();  
    }  

    UpdateData(true);          // 获取数据  
    path = strFile;  
    UpdateData(false);         // 更新数据  
} 
void CcompressDlg::OnBnClickedButton3()  
{  
    // TODO: 在此添加控件通知处理程序代码  
    CString strFile = _T("");  

    CFileDialog    dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.cfg)|*.cfg|All Files (*.*)|*.*||"), NULL);  

    if (dlgFile.DoModal())  
    {  
        strFile = dlgFile.GetPathName();  
    }  

    UpdateData(true);          // 获取数据  
    path = strFile;  
    UpdateData(false);         // 更新数据  
}  

二、选择解压缩文件按钮

void CcompressDlg::OnBnClickedButton4()  
{  
    // TODO: 在此添加控件通知处理程序代码  
    CString strFile = _T("");  

    CFileDialog    dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.cfg)|*.cfg|All Files (*.*)|*.*||"), NULL);  

    if (dlgFile.DoModal())  
    {  
        strFile = dlgFile.GetPathName();  
    }  

    UpdateData(true);          // 获取数据  
    path_decompress = strFile;  
    UpdateData(false);         // 更新数据  
} 
void CcompressDlg::OnBnClickedButton4()  
{  
    // TODO: 在此添加控件通知处理程序代码  
    CString strFile = _T("");  

    CFileDialog    dlgFile(TRUE, NULL, NULL, OFN_HIDEREADONLY, _T("Describe Files (*.cfg)|*.cfg|All Files (*.*)|*.*||"), NULL);  

    if (dlgFile.DoModal())  
    {  
        strFile = dlgFile.GetPathName();  
    }  

    UpdateData(true);          // 获取数据  
    path_decompress = strFile;  
    UpdateData(false);         // 更新数据  
} 

三、压缩按钮

void CcompressDlg::OnBnClickedButton1()  
{  
    // TODO: 在此添加控件通知处理程序代码  
#ifdef _UNICODE  
    LONG len1;  
    len1 = WideCharToMultiByte(CP_ACP, 0, path, -1, NULL, 0, NULL, NULL);  
    char *textPath = (char *)malloc(sizeof(char)*(len1 + 1));  
    memset(textPath, 0, len1 + 1);  
    WideCharToMultiByte(CP_ACP, 0, path, -1, textPath, len1 + 1, NULL, NULL);  
#else  
    ptr = new char[str.GetAllocLength() + 1];  
#endif  
    err = fopen_s(&ifp, textPath, "rb");  
    if (err == 0)  
    {  
        printf("Thefile'crt_fopen_s.c'wasopened\n");  
    }  
    fseek(ifp, 0, SEEK_END);  
    unsigned long len = ftell(ifp);  
    myInLen = len;  
    fseek(ifp, 0, SEEK_SET);  
    cpTemp = (char*)malloc(len * sizeof(char));  
    fread(cpTemp, sizeof(char), len, ifp);  
    char *in = cpTemp;  
    char *out = (char*)malloc((len + len / 16 + 64 + 3) * sizeof(char));  

    if (lzo_init() != LZO_E_OK)  
    {  
        printf("internal error - lzo_init() failed !!!\n");  
        printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)\n");  

    }  

    lzo_uint in_len;  
    in_len = len;  
    lzo_memset(in, 0, in_len);  
    lzo_uint out_len;  

    int r;  

    r = lzo1x_1_compress((unsigned char*)in, in_len, (unsigned char*)out, &out_len, wrkmem);  
    char mess[256];  

    if (r == LZO_E_OK)  
    {  
        sprintf_s(mess, sizeof(mess),  "压缩成功!\n\n原文件大小:%lu bytes\n压缩后大小:%lu bytes\n\n解压得到的文件“compress.txt”保存于工程目录下",  
            (unsigned long)in_len, (unsigned long)out_len);  
        MessageBox(CString(mess));  

    }  
    else  
    {  
        /* this should NEVER happen */  
        sprintf_s(mess, sizeof(mess), "压缩失败!\n %d\n", r);  
        MessageBox(CString(mess));  
    }  
    /* check for an incompressible block */  
    if (out_len >= in_len)  
    {  
        sprintf_s(mess, sizeof(mess), "未压缩!\n");  
        MessageBox(CString(mess));  
    }  

    err = fopen_s(&ofp, ".\\compress.txt", "wb");  
    fwrite(out, sizeof(char), out_len, ofp);  

    fclose(ifp);  
    fclose(ofp);  
    free(cpTemp);  
    free(out);  
    free(textPath);  

}
void CcompressDlg::OnBnClickedButton1()  
{  
    // TODO: 在此添加控件通知处理程序代码  
#ifdef _UNICODE  
    LONG len1;  
    len1 = WideCharToMultiByte(CP_ACP, 0, path, -1, NULL, 0, NULL, NULL);  
    char *textPath = (char *)malloc(sizeof(char)*(len1 + 1));  
    memset(textPath, 0, len1 + 1);  
    WideCharToMultiByte(CP_ACP, 0, path, -1, textPath, len1 + 1, NULL, NULL);  
#else  
    ptr = new char[str.GetAllocLength() + 1];  
#endif  
    err = fopen_s(&ifp, textPath, "rb");  
    if (err == 0)  
    {  
        printf("Thefile'crt_fopen_s.c'wasopened\n");  
    }  
    fseek(ifp, 0, SEEK_END);  
    unsigned long len = ftell(ifp);  
    myInLen = len;  
    fseek(ifp, 0, SEEK_SET);  
    cpTemp = (char*)malloc(len * sizeof(char));  
    fread(cpTemp, sizeof(char), len, ifp);  
    char *in = cpTemp;  
    char *out = (char*)malloc((len + len / 16 + 64 + 3) * sizeof(char));  

    if (lzo_init() != LZO_E_OK)  
    {  
        printf("internal error - lzo_init() failed !!!\n");  
        printf("(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)\n");  

    }  

    lzo_uint in_len;  
    in_len = len;  
    lzo_memset(in, 0, in_len);  
    lzo_uint out_len;  

    int r;  

    r = lzo1x_1_compress((unsigned char*)in, in_len, (unsigned char*)out, &out_len, wrkmem);  
    char mess[256];  

    if (r == LZO_E_OK)  
    {  
        sprintf_s(mess, sizeof(mess),  "压缩成功!\n\n原文件大小:%lu bytes\n压缩后大小:%lu bytes\n\n解压得到的文件“compress.txt”保存于工程目录下",  
            (unsigned long)in_len, (unsigned long)out_len);  
        MessageBox(CString(mess));  

    }  
    else  
    {  
        /* this should NEVER happen */  
        sprintf_s(mess, sizeof(mess), "压缩失败!\n %d\n", r);  
        MessageBox(CString(mess));  
    }  
    /* check for an incompressible block */  
    if (out_len >= in_len)  
    {  
        sprintf_s(mess, sizeof(mess), "未压缩!\n");  
        MessageBox(CString(mess));  
    }  

    err = fopen_s(&ofp, ".\\compress.txt", "wb");  
    fwrite(out, sizeof(char), out_len, ofp);  

    fclose(ifp);  
    fclose(ofp);  
    free(cpTemp);  
    free(out);  
    free(textPath);  

}  

四、解压缩按钮

void CcompressDlg::OnBnClickedButton2()  
{  
    // TODO: 在此添加控件通知处理程序代码  
#ifdef _UNICODE  
    LONG len1;  
    len1 = WideCharToMultiByte(CP_ACP, 0, path_decompress, -1, NULL, 0, NULL, NULL);  
    char *textPath = (char *)malloc(sizeof(char)*(len1 + 1));  
    memset(textPath, 0, len1 + 1);  
    WideCharToMultiByte(CP_ACP, 0, path_decompress, -1, textPath, len1 + 1, NULL, NULL);  
#else  
    ptr = new char[str.GetAllocLength() + 1];  
#endif  
    err = fopen_s(&ifp, textPath, "rb");  
    if (err == 0)  
    {  
        printf("Thefile'crt_fopen_s.c'was opened\n");  
    }  
    fseek(ifp, 0, SEEK_END);  
    unsigned long len = ftell(ifp);  
    fseek(ifp, 0, SEEK_SET);  
    cpTemp = (char*)malloc(len * sizeof(char));  
    fread(cpTemp, sizeof(char), len, ifp);  
    char *in = cpTemp;  
    char *out = (char *)malloc(len*100* sizeof(char));  
    memset(out, 0, len * 100 * sizeof(char));  

    int r;  
    lzo_uint new_len;  
    r = lzo1x_decompress((unsigned char*)in, len, (unsigned char*)out, &new_len, NULL);  

    char mess[256];  
    if (r == LZO_E_OK && new_len == myInLen)  
    {  
        sprintf_s(mess, sizeof(mess), "解压成功!\n\n待解压文件大小: %lu bytes\n解压后文件大小: %lu bytes\n\n解压得到的文件“decompress.txt”保存于工程目录下",  
            (unsigned long)len, (unsigned long)new_len);  
        MessageBox(CString(mess));  
    }  
    else  
    {  
        /* this should NEVER happen */  
        sprintf_s(mess, sizeof(mess), "解压失败! %d\n", r);  
        MessageBox(CString(mess));  
    }  
    err = fopen_s(&ofp, ".\\decompress.txt", "wt+");  
    fwrite(out, sizeof(char), new_len, ofp);  

    fclose(ifp);  
    fclose(ofp);  
    free(cpTemp);  
    free(textPath);  
    free(out);  
}  
void CcompressDlg::OnBnClickedButton2()  
{  
    // TODO: 在此添加控件通知处理程序代码  
#ifdef _UNICODE  
    LONG len1;  
    len1 = WideCharToMultiByte(CP_ACP, 0, path_decompress, -1, NULL, 0, NULL, NULL);  
    char *textPath = (char *)malloc(sizeof(char)*(len1 + 1));  
    memset(textPath, 0, len1 + 1);  
    WideCharToMultiByte(CP_ACP, 0, path_decompress, -1, textPath, len1 + 1, NULL, NULL);  
#else  
    ptr = new char[str.GetAllocLength() + 1];  
#endif  
    err = fopen_s(&ifp, textPath, "rb");  
    if (err == 0)  
    {  
        printf("Thefile'crt_fopen_s.c'was opened\n");  
    }  
    fseek(ifp, 0, SEEK_END);  
    unsigned long len = ftell(ifp);  
    fseek(ifp, 0, SEEK_SET);  
    cpTemp = (char*)malloc(len * sizeof(char));  
    fread(cpTemp, sizeof(char), len, ifp);  
    char *in = cpTemp;  
    char *out = (char *)malloc(len*100* sizeof(char));  
    memset(out, 0, len * 100 * sizeof(char));  

    int r;  
    lzo_uint new_len;  
    r = lzo1x_decompress((unsigned char*)in, len, (unsigned char*)out, &new_len, NULL);  

    char mess[256];  
    if (r == LZO_E_OK && new_len == myInLen)  
    {  
        sprintf_s(mess, sizeof(mess), "解压成功!\n\n待解压文件大小: %lu bytes\n解压后文件大小: %lu bytes\n\n解压得到的文件“decompress.txt”保存于工程目录下",  
            (unsigned long)len, (unsigned long)new_len);  
        MessageBox(CString(mess));  
    }  
    else  
    {  
        /* this should NEVER happen */  
        sprintf_s(mess, sizeof(mess), "解压失败! %d\n", r);  
        MessageBox(CString(mess));  
    }  
    err = fopen_s(&ofp, ".\\decompress.txt", "wt+");  
    fwrite(out, sizeof(char), new_len, ofp);  

    fclose(ifp);  
    fclose(ofp);  
    free(cpTemp);  
    free(textPath);  
    free(out);  
}  

界面效果如图:

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在STM32上移植Mini LZO2.09压缩算法需要以下步骤: 1. 了解Mini LZO2.09压缩算法的原理和实现。Mini LZO2.09是一个轻量级的压缩算法库,它旨在提供高压缩比和快速压缩速度。 2. 配置STM32开发环境。安装相应的开发工具链、IDE,例如Keil MDK或者IAR Embedded Workbench,以及STM32的相关库和驱动。 3. 下载Mini LZO2.09压缩算法库的源代码。通常,源代码会以C语言的形式提供,包含压缩解压函数以及相关的数据结构。 4. 创建一个新的STM32项目。在开发环境中,创建一个新的STM32项目,并配置相应的硬件设置(例如选择MCU型号、配置时钟、外设等)。 5. 添加Mini LZO2.09压缩算法库的源代码到项目中。将下载的Mini LZO2.09源代码文件添加到STM32项目的源代码文件夹中。 6. 编译项目。使用开发环境提供的编译工具对项目进行编译,确保没有语法错误和编译警告。 7. 进行移植适配。由于Mini LZO2.09压缩算法库可能使用了一些与STM32平台不兼容的函数或者数据结构,需要进行适当的修改和调整。这可能包括更改数据类型、适配存储器访问等。 8. 测试和验证。编写一些测试用例,对移植后的Mini LZO2.09压缩算法进行测试和验证,确保它在STM32平台上正常工作并且具有预期的压缩效果和速度。 9. 优化和调试。根据实际需求,对移植后的Mini LZO2.09压缩算法进行优化和调试,以提高压缩效率和速度,同时确保稳定性和可靠性。 10. 集成到实际项目中。将移植和优化后的Mini LZO2.09压缩算法集成到实际的STM32项目中,并进行实际应用的测试和验证。 以上是将Mini LZO2.09压缩算法移植到STM32的大致步骤。具体的移植过程和细节可能会因为不同的硬件平台和开发环境而有所差异。在移植过程中,需要仔细阅读Mini LZO2.09的文档和源代码,并进行适当的修改和调整,以适应STM32的硬件特性和开发环境的要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值