SZ_ERROR_DATA из функции LzmaDecode (C lzma) - PullRequest
1 голос
/ 08 апреля 2020

У меня есть массив чисел, которые я хочу сжать и сохранить в файле, затем распаковать и поместить данные в буфер.

RAM-> FILE сжатие

FILE-> RAM сжатие памяти

Я использовал LzmaEncode для сжатия и записи буфера сжатия в файл.

lzmaencoder. c

int main(void){
int data[] = {1,2,3,4,5};

size_t src_len = sizeof(data);
const Byte * src = (Byte *) data;

size_t compressed_size = src_len*1.5;
Byte * compressed_data = malloc(compressed_size);

CLzmaEncProps props;   
LzmaEncProps_Init(&props);

Byte header[LZMA_PROPS_SIZE];
size_t headerSize = LZMA_PROPS_SIZE;

// Call encoding function:
SRes res;
res = LzmaEncode(compressed_data, &compressed_size, src, src_len, 
                &props, header, &headerSize, 0, NULL,  &g_Alloc, &g_Alloc);

if(res == SZ_OK){
    FILE * file = fopen("lzma_file","wb");
    fwrite(compressed_data, sizeof(Byte), compressed_size, file);
}

free(compressed_data);   
return (0);
}

Я читаю сжатый файл и записываю данные в буфер, затем использую LzmaDecode для распаковки.

lzmadecoder. c

int main(int argc, char * argv[]){
// I know the original data size
size_t uncompress_size = 20;
Byte * uncompress = malloc(uncompress_size);

// open compressed file
size_t compress_size;
FILE * compress_file = fopen("lzma_file", "rb");

if(!compress_file){
    printf("Error: can not open lzma_file file.");
}

// get compressed file size
fseek(compress_file, 0, SEEK_END);
compress_size = ftell(compress_file);
fseek(compress_file, 0, SEEK_SET);


Byte *compress_data = malloc(compress_size);

// put compressed file data on RAM
if(!fread(compress_data, sizeof(Byte), compress_size, compress_file)){
    printf("Error: can not read lzma_file file.");
}
fclose(compress_file);

ELzmaStatus status;

// RAM->RAM decompressing
int res = LzmaDecode(uncompress, &uncompress_size, 
                    compress_data, &compress_size, 
                    compress_data, 5, 
                    LZMA_FINISH_END, &status, &g_Alloc);
if(res==SZ_OK){
    printf("SZ_OK!\n");
} else if(res==SZ_ERROR_DATA){
    printf("SZ_ERROR_DATA!\n");
}

free(uncompress);
free(compress_data);
return (0);
}

но LzmaDecode возврат SZ_ERROR_DATA . Я не могу найти свою проблему.

...