файл — сжатие C ++ с использованием lz4, сжатая информация не такая, как ожидалось

Я использую lz4 на Mac и провожу эксперимент по сжатию строки (с именем str) в моей программе.

#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;
}

Запустите эту программу, я проверил файл «lz4.dat»:

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

Это 34 байта, хорошо, но вывод программы:

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

Очень странно, кажется, что полученный размер файла составляет 1 байт, и я на самом деле вывожу случайное значение @ 1010. Почему мой is.tellg () не получил правильную длину файла?

Благодарю.

1

Решение

ifstream::read() не возвращает прочитанные байты. Возвращает ссылку на *this, у которого есть operator bool(), который используется на всякий случай, я думаю. Так ты в n, вы получаете, была ли операция успешной.

Вывод, кажется, совершенно нормально, это начало сжатых данных. Я думаю, что напечатано только несколько байтов, потому что он содержит завершающий ноль. И это похоже на ваш ввод, потому что lz4 дословно помещает литералы в поток (lz4 не имеет энтропийного кодирования)

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]