0

アプリケーションで使用する lzo ライブラリを取得しました。提供されたバージョンは 1.07 です。彼らは、いくつかのヘッダー ファイルといくつかの .c ソース ファイルと共に .lib をくれました。

仕様に従ってテスト環境をセットアップしました。アプリケーションで 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 */ );

なにが問題ですか?

4

2 に答える 2

0

解凍されたデータには 512 バイトで十分ですか? 任意の値を使用するべきではありませんが、ファイルが圧縮されたときにヘッダーとして元のサイズをどこかに隠しておく必要があります。

LZO 解凍バッファサイズ

おそらく、データ型をインターフェイスの仕様と一致させるo_len必要があります (たとえばlzo_uint、アドレスを渡す必要があるため、実際の基になる型が重要になります)。

それを超えて、それはオープンソースです。では、デバッグ情報を使用して lzo をビルドし、そこに踏み込んで問題の場所を確認してみませんか?

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

于 2010-03-10T09:01:09.287 に答える
-1

提案とコメントをくれたみんなに感謝します。

問題はデータにありました。解凍に成功しました。

于 2010-03-11T08:27:13.063 に答える