7zip — lzma сжимает / распаковывает из памяти переполнение стека

У меня работает код, но я не полностью удовлетворен результатом, поэтому я решил задать несколько вопросов здесь.

Вот мои две функции:

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

  1. В обеих функциях, как я должен знать, какое значение поместить в dstLen? Я не хочу выделять много памяти даром.
  2. Это плохо, что я должен бросить на чар *? Я действительно должен использовать неподписанный символ?
  3. Я попытался изменить последний аргумент LzmaCompress (numThreads), это не улучшило производительность, даже немного. Есть что-то еще, чтобы сделать?
  4. если у вас есть какие-либо советы, не стесняйтесь сказать мне.

Благодарю.

0

Решение

Используйте следующую функцию, чтобы получить размер назначения:

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

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

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

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