использование библиотеки lzo в приложении c ++ - PullRequest
0 голосов
/ 10 марта 2010

Я получил библиотеку 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 */ );

Что не так?

Ответы [ 2 ]

0 голосов
/ 11 марта 2010

Спасибо всем за предложения и комментарии.

Проблема была с данными. Я успешно распаковал его.

0 голосов
/ 10 марта 2010

Вы уверены, что 512 байт достаточно для распакованных данных? Вы не должны использовать произвольное значение, скорее вы должны были убрать оригинальный размер где-нибудь в качестве заголовка, когда ваш файл был сжат:

Размер буфера декомпрессии LZO

Вероятно, вы должны сделать так, чтобы ваши типы данных соответствовали спецификации интерфейса (например, o_len должно быть lzo_uint ... вы передаете адрес, так что фактический базовый тип имеет значение).

Кроме того, это открытый исходный код. Так почему бы вам не собрать lzo с отладочной информацией и войти в нее, чтобы увидеть, в чем проблема?

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

...