2017-07-15 7 views
1

J'utilise lz4 sur mac et faire une expérience pour compresser une chaîne (appelée str) dans mon programme.compression C++ en utilisant lz4, informations compressées pas comme prévu

#include <fstream> 
#include <iostream> 
#include "lz4.h" 
using namespace std; 
int main(){ 
    char str[] = "10100100010000100000100000010000000100000000100000000010000000000"; 
    size_t len = sizeof(str); 
    char* target = new char[len]; 
    int nCompressedSize = LZ4_compress_default((const char *)(&str), target, len, len); 

    ofstream os("lz4.dat",ofstream::binary); 
    os.write(target, nCompressedSize); 
    os.close(); 
    delete[] target; 
    target = 0; 

    ifstream is("lz4.dat", ifstream::binary); 
    is.seekg (0,is.end); 
    size_t nCompressedInputSize = is.tellg(); 
    is.clear(); 
    is.seekg(0,ios::beg); 

    //Read file into buffer 
    char* in = new char[nCompressedInputSize]; 
    int32_t n=is.read(in,nCompressedSize); 
    cout<<"Byte number:"<<nCompressedSize<<",file size:"<<n<<",bytes read:"<<in<<endl; 
    is.close(); 
    return 0; 
} 

Exécuter ce programme, j'ai vérifié le fichier "lz4.dat":

$ls -lrt lz4.dat 
-rw-r--r-- 1 x staff 34 7 15 14:50 lz4.dat 

Il est 34 octets, OK, mais la sortie du programme est:

Byte number:34,file size:1,bytes read:@1010 

Très étrange, semble que la taille du fichier reçu est de 1 octet, et je produis en fait un certain randome @ 1010. Pourquoi mon "is.tellg()" n'a pas obtenu la bonne longueur de fichier?

Merci.

+0

Avez-vous vérifié nCompressedSize? Est-ce plus grand que 34 octets? Le point est que la chaîne compressée peut être plus longue que la chaîne initiale si la chaîne est petite –

Répondre

2

ifstream::read() ne renvoie pas les octets lus. Il renvoie une référence à *this, qui a operator bool(), qui est utilisé dans le cas, je pense. Donc vous dans n, vous obtenez si l'opération a été réussie.

La sortie semble être très bien, c'est le début des données compressées. Je pense qu'il n'y a que plusieurs octets imprimés, car il contient un zéro final. Et cela ressemble à votre entrée, car lz4 place littéralement les littéraux dans le flux (lz4 n'a pas d'encodage entropique)