У меня работает код, но я не полностью удовлетворен результатом, поэтому я решил задать несколько вопросов здесь.
Вот мои две функции:
void compress(string nameSrc, string nameDst){
ifstream input;
input.open(nameSrc,fstream::in | fstream::binary);
size_t propsSize = LZMA_PROPS_SIZE;
size_t srcLen = getLength(input);
size_t dstLen = srcLen; //??? no idea how to know to right value here
unsigned char* src = new unsigned char[srcLen];
unsigned char* dst = new unsigned char[dstLen + propsSize];
input.read((char*)src, srcLen);
int res = LzmaCompress(
&dst[LZMA_PROPS_SIZE], &dstLen,
src, srcLen,
dst, &propsSize,
-1, 0, -1, -1, -1, -1, -1);
delete [] src;
input.close();
ofstream output(nameDst, ios::binary);
output.write((char*)dst, dstLen + propsSize);
delete [] dst;}
а также :
void unCompress(string nameSrc, string nameDst){
ifstream input;
input.open(nameSrc,fstream::in | fstream::binary);
size_t srcLen = getLength(input);
size_t dstLen = srcLen*5; //??? no idea how to know to right value here
unsigned char* src = new unsigned char[srcLen];
unsigned char* dst = new unsigned char[dstLen];
input.read((char*)src,srcLen);
int res = LzmaUncompress(dst,&dstLen,&src[LZMA_PROPS_SIZE],&srcLen, src, LZMA_PROPS_SIZE);
delete [] src;
input.close();
ofstream output(nameDst, ios::binary);
output.write((char*)dst, dstLen);
delete [] dst;
}
Благодарю.
Используйте следующую функцию, чтобы получить размер назначения:
INT32
EFIAPI
LzmaGetInfo(
CONST VOID *Source,
UINT32 SourceSize,
UINT32 *DestinationSize
)
{
UInt64 DecodedSize;
ASSERT(SourceSize >= LZMA_HEADER_SIZE); (void)SourceSize;
DecodedSize = GetDecodedSizeOfBuf((UINT8*)Source);
*DestinationSize = (UINT32)DecodedSize;
return ERR_SUCCESS;
}
Других решений пока нет …