Bir dosya akışını LZO ile sıkıştırmaya ve çok uzaklaşmaya çalışmıyorum. Özellikle, compressFileWithLzo1x
işlevimin oluşturduğu arşiv dosyasını ayıklarken bölümleme hatası alıyorum.LZO bir dosya akışı ile çalışmak nasıl?
Benim main
fonksiyonu ve prototip bildirimleri şunlardır:
int extractFileWithLzo1x(const char *inFn) {
FILE *inFnPtr = fopen(inFn, "rb");
lzo_bytep in = (lzo_bytep)malloc(LZO_IN_CHUNK);
lzo_bytep out = (lzo_bytep)malloc(LZO_OUT_CHUNK);
int extractionResult;
size_t inResult;
lzo_uint new_length;
if (lzo_init() != LZO_E_OK)
return -1;
do {
new_length = LZO_IN_CHUNK;
inResult = fread(in, sizeof(lzo_byte), LZO_IN_CHUNK, inFnPtr);
extractionResult = lzo1x_decompress(out, LZO_OUT_CHUNK, in, &new_length, NULL);
if ((extractionResult != LZO_E_OK) || (new_length != LZO_IN_CHUNK))
return -1;
fprintf(stderr, "out: [%s]\n", (unsigned char *)out);
} while (!feof(inFnPtr) && (!ferror(inFnPtr));
free(in);
free(out);
fclose(inFnPtr);
return 0;
}
: Burada
int compressFileWithLzo1x(const char *inFn, const char *outFn) {
FILE *inFnPtr = fopen(outFn, "r");
FILE *outFnPtr = fopen(outFn, "wb");
int compressionResult;
lzo_bytep in;
lzo_bytep out;
lzo_voidp wrkmem;
lzo_uint out_len;
size_t inResult;
if (lzo_init() != LZO_E_OK)
return -1;
in = (lzo_bytep)malloc(LZO_IN_CHUNK);
out = (lzo_bytep)malloc(LZO_OUT_CHUNK);
wrkmem = (lzo_voidp)malloc(LZO1X_1_MEM_COMPRESS);
do {
inResult = fread(in, sizeof(lzo_byte), LZO_IN_CHUNK, inFnPtr);
if (inResult == 0)
break;
compressionResult = lzo1x_1_compress(in, LZO_IN_CHUNK, out, &out_len, wrkmem);
if ((out_len >= LZO_IN_CHUNK) || (compressionResult != LZO_E_OK))
return -1;
if (fwrite(out, sizeof(lzo_byte), (size_t)out_len, outFnPtr) != (size_t)out_len || ferror(outFnPtr))
return -1;
fflush(outFnPtr);
} while (!feof(inFnPtr) && !ferror(inFnPtr));
free(wrkmem);
free(out);
free(in);
fclose(inFnPtr);
fclose(outFnPtr);
return 0;
}
benim dekompresyon fonksiyonunun uygulamasıdır: Burada
#include <stdio.h>
#include <stdlib.h>
#include "lzo/include/lzo/lzo1x.h"
#define LZO_IN_CHUNK (128*1024L)
#define LZO_OUT_CHUNK (LZO_IN_CHUNK + LZO_IN_CHUNK/16 + 64 + 3)
int compressFileWithLzo1x(const char *inFn, const char *outFn);
int extractFileWithLzo1x(const char *inFn);
int main(int argc, char **argv) {
const char *inFilename = "test.txt";
const char *outFilename = "test.txt.lzo1x";
if (compressFileWithLzo1x(inFilename, outFilename) != 0)
exit(EXIT_FAILURE);
if (extractFileWithLzo1x(outFilename) != 0)
exit(EXIT_FAILURE);
return 0;
}
benim sıkıştırma fonksiyonu uygulamasıdır
Segmentasyon hatası burada oluşur:
extractionResult = lzo1x_decompress(out, LZO_OUT_CHUNK, in, &new_length, NULL);
Bölütleme hatasına neden olan bu yaklaşımda sorun nedir?
Umarım bu sefer kodum çıkmamıştır. Daha fazla bilgi eklemem gerekirse bana bildirmekten çekinmeyin. Tavsiyeniz için şimdiden teşekkür ederiz.
yaklaştıkça olmalı, sanırım, ama yapıyor 'fprintf()' öncesi ve sonrası ifadeleri ' lzo1x_1_compress() 'çağrısı (in' ve 'out' arabelleklerine bakın), metin verilerinin sıkıştırılmamasını önerir. –