2010-11-18 54 views
1

我在我的Ubuntu機器上安裝了LZO,我想用ti來壓縮char *類型的字符串。LZO compress char *

在這個例子中的文件,我發現這個代碼片斷(我已經編輯它只是一點點我的應用程序):

int r; 
    lzo_bytep in; 
    lzo_bytep out; 
    lzo_voidp wrkmem; 
    lzo_uint in_len; 
    lzo_uint out_len; 
    lzo_uint new_len; 
    int strToCompressLen; // I have added this 

    /* 
    * Step 1: initialize the LZO library 
    */ 
    if (lzo_init() != LZO_E_OK) 
    { 
    cout << "internal error - lzo_init() failed !!!" << endl; 
    cout << "(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)" << endl; 
    //return 4; 
    } 

    // here I get the data I want to compress 
    char* imageData = (char*)imageIn->getFrame(); 

    /* 
    * Step 2: allocate blocks and the work-memory 
    */ 
    strToCompressLen = strlen(imageData); 
    in = (lzo_bytep) xmalloc(strToCompressLen); 
    out = (lzo_bytep) xmalloc((strToCompressLen + strToCompressLen/16 + 64 + 3)); 
    wrkmem = (lzo_voidp) xmalloc(LZO1X_1_MEM_COMPRESS); 
    if (in == NULL || out == NULL || wrkmem == NULL) 
    { 
     cout << "out of memory" << endl; 
     //return 3; 
    } 

    /* 
    * Step 3: prepare the input block that will get compressed. 
    *   We just fill it with zeros in this example program, 
    *   but you would use your real-world data here. 
    */ 
    in_len = strToCompressLen; 
    lzo_memset(in,0,in_len); 

    /* 
    * Step 4: compress from 'in' to 'out' with LZO1X-1 
    */ 
    r = lzo1x_1_compress(in,in_len,out,&out_len,wrkmem); 
    if (r != LZO_E_OK) 
    { 
     /* this should NEVER happen */ 
     cout << "internal error - compression failed: " << r << endl; 
     //return 2; 
    } 
    /* check for an incompressible block */ 
    if (out_len >= in_len) 
    { 
     cout << "This block contains incompressible data." << endl; 
    //return 0; 
    } 

但它所做的只是填零。我需要壓縮一個char *變量。

我想我需要編輯這些行:

in_len = strToCompressLen; 
    lzo_memset(in,0,in_len); 

我有我想在這個變量來壓縮字符串:

char* imageData = (char*)imageIn->getFrame(); 

我需要將它轉換爲其他類型?

LZO的文檔不是很有幫助(或者我不能正確使用它)。

+0

'<<'是'C'中的左移運算符。您正在使用它並放棄結果...所以,最好的情況是,這些陳述沒有任何影響。 – pmg 2010-11-18 22:05:41

+0

這是C++代碼。 – 2010-11-18 22:16:40

+0

'c'標籤被移除 – pmg 2010-11-18 22:29:51

回答

2

有困惑的三個要點:

  1. 最好不要使用字符*當 緩衝指針指向是 不是一個空結束的字符串,因爲它是 混亂。
  2. strlen()只會給你 一個以空字符結尾的字符串的長度, 它不會給你一個內存中任意緩衝區大小的 。您需要 才能在其他地方獲取該信息。
  3. 傳遞給 lzo1x_1_compress()實際上需要 緩衝區包含 全是零,你想 壓縮數據,而不是一個空的緩衝區。

假設你可以使用類似imageIn-> getFrameSizeBytes()讓您的圖像從imageIn大小,試試這個:

int r; 
    lzo_bytep out; 
    lzo_voidp wrkmem; 
    lzo_uint out_len; 
    lzo_uint new_len; 

    /* 
    * Step 1: initialize the LZO library 
    */ 
    if (lzo_init() != LZO_E_OK) 
    { 
    cout << "internal error - lzo_init() failed !!!" << endl; 
    cout << "(this usually indicates a compiler bug - try recompiling\nwithout optimizations, and enable '-DLZO_DEBUG' for diagnostics)" << endl; 
    //return 4; 
    } 

    // here I get the data I want to compress 
    lzo_bytep imageData = (lzo_bytep) imageIn->getFrame(); 
    size_t uncompressedImageSize = imageIn->getFrameSizeBytes(); 

    /* 
    * Step 2: allocate blocks and the work-memory 
    */ 
    out = (lzo_bytep) xmalloc((uncompressedImageSize + uncompressedImageSize/16 + 64 + 3)); 
    wrkmem = (lzo_voidp) xmalloc(LZO1X_1_MEM_COMPRESS); 
    if (out == NULL || wrkmem == NULL) 
    { 
     cout << "out of memory" << endl; 
     //return 3; 
    } 

    /* 
    * Step 4: compress from 'imageData' to 'out' with LZO1X-1 
    */ 
    r = lzo1x_1_compress(imageData,uncompressedImageSize,out,&out_len,wrkmem); 
    if (r != LZO_E_OK) 
    { 
     /* this should NEVER happen */ 
     cout << "internal error - compression failed: " << r << endl; 
     //return 2; 
    } 

    /* check for an incompressible block */ 
    if (out_len >= uncompressedImageSize) 
    { 
     cout << "This block contains incompressible data." << endl; 
    //return 0; 
    } 

不要忘記釋放wrkmem。更好的是,使用C++和std :: vector作爲工作內存,以便自動釋放它。

+0

我有一個圖像的高度和寬度。 cvSize(寬度,高度)會爲我提供LZO的正確字節大小嗎? – 2010-11-18 23:07:19

+0

寬度*高度可能與每個像素有一個字節並且在行尾沒有填充一樣長。不知道getFrame()是什麼很難知道! – Bids 2010-11-18 23:29:07

+0

這是一張帶YUV色彩空間的640x480px圖像。 sizeof(imageData)不會起作用嗎?對不起,如果這是一個愚蠢的問題,我是一個C++新手。 – 2010-11-18 23:43:19

2

getFrame()返回什麼類型?你爲什麼需要將它投射到char*?最明顯的問題是在二進制數據上使用strlen() - strlen在遇到第一個零字節時停止。

+0

好了,後來我用OpenCV編輯框架。但沒關係,它沒有壓縮效果很好。鑄造字符不會造成任何問題。我只需要壓縮它,因爲我將通過無線網絡將幀發送到另一臺PC,並且我想節省帶寬。 – 2010-11-18 22:03:52

+0

對於下面的壓縮問題的答案,我個人不會打擾壓縮的額外複雜性,除非分析表明網絡已飽和並且傳輸速度不夠快。現代的WiFi有相當多的帶寬! – Bids 2010-11-18 22:20:33

+0

@Bird其實問題是wifi不夠快。現在我們得到15fps(每秒15幀)。我們需要它變得更快,所以我認爲壓縮可以幫助我們。 – 2010-11-18 22:32:34