【问题标题】:using lzo library in c++ application在 C++ 应用程序中使用 lzo 库
【发布时间】:2010-03-10 08:47:03
【问题描述】:

我在我们的应用程序中使用了 lzo 库。提供的版本是 1.07。 他们给了我 .lib 以及一些头文件和一些 .c 源文件。

我已经按照规范设置了测试环境。我可以在我的应用程序中看到 lzo 例程函数。

这是我的测试应用程序

#include "stdafx.h"
#include "lzoconf.h"
#include "lzo1z.h"
#include <stdlib.h>


int _tmain(int argc, _TCHAR* argv[])
{
    FILE * pFile;
    long lSize;
    unsigned char *i_buff;
    unsigned char *o_buff;

    int i_len,e = 0;
    unsigned int o_len;

    size_t result;

    //data.txt have a single compressed packet 
    pFile = fopen("data.txt","rb");

    if (pFile==NULL) 
        return -1;

    // obtain file size:
    fseek (pFile , 0 , SEEK_END);
    lSize = ftell (pFile);
    rewind (pFile);

    // allocate memory to contain the whole file:
    i_buff = (unsigned char*) malloc (sizeof(char)*lSize);
    if (i_buff == NULL) 
        return -1;

    // copy the file into the buffer:
    result = fread (i_buff,1,lSize,pFile);
    if (result != lSize) 
        return -1;

    i_len = lSize;
    o_len = 512;

    // allocate memory for output buffer
    o_buff = (unsigned char*) malloc(sizeof(char)*o_len);

    if (o_buff == NULL) 
        return -1;
     lzo_memset(o_buff,0,o_len);    
    lzo1z_decompress(i_buff,i_len,o_buff,&o_len,NULL);

    return 0;   
}

它在最后一行给出访问冲突。

lzo1z_decompress(i_buff,i_len,o_buff,&o_len,NULL);

在为上述函数提供的库签名中是

lzo1z_decompress        ( const lzo_byte *src, lzo_uint  src_len,
                                lzo_byte *dst, lzo_uint *dst_len,
                                lzo_voidp wrkmem /* NOT USED */ );

怎么了?

【问题讨论】:

  • 你检查过 malloc() 返回的内容吗?它可能会返回一个空指针。
  • 您是否还尝试将传递给 decompress() 的所有参数转储到控制台?也许他们中的一些人出于某种原因有不合理的价值观。
  • 第二个参数发生了什么?它曾经是一个指针。
  • @sharptooth 上面的代码仅用于测试目的,因此没有任何错误检查。我可以在调试器中看到一切正常。它只是在最后一行给出错误。代码成功读取文件分配输入和输出缓冲区。设置输入长度和设置输出长度为0。
  • @nobugz 如果你参考我之前的帖子,这是 lzo.h 中定义的另一个函数

标签: c++ compression lzo


【解决方案1】:

您确定 512 字节对于解压缩的数据足够大吗?您不应该使用任意值,而是应该在压缩文件时将原始大小作为标题存放在某处:

LZO Decompression Buffer Size

您可能应该使您的数据类型与接口规范相匹配(例如,o_len 应该是 lzo_uint...您正在传递一个地址,因此实际的底层类型很重要)。

除此之外,它是开源的。那么为什么不使用调试信息构建 lzo 并进入其中查看问题所在呢?

http://www.oberhumer.com/opensource/lzo/

【讨论】:

  • i_len 初始化为 280。我的输入数据是 280 字节。我可以在调试器中看到它正在完美初始化。请参阅已编辑的代码代码,我已添加 lzo_memset 以初始化 o_burff
  • 糟糕,我没有注意到您的代码示例上的滚动条,因此认为它在 fread 之前就结束了。 (我讨厌内部面板的大小是固定的,并且有自己的滚动条独立于页面的滚动条!)更新。
【解决方案2】:

感谢大家的建议和cmets。

问题出在数据上。我已经成功解压了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2023-04-04
    • 2014-12-11
    • 1970-01-01
    相关资源
    最近更新 更多