Реализация LZMA сжимать / распаковывать

Фон

у меня есть VS2015 C ++ решение, содержащее множество проектов. Мой вывод работает только в среде Windows.

Мне нужно добавить функции Utility в мой проект, которые будут обрабатывать данные LZMA.

Естественно, я пошел и принес мне LZMA SDK.

Препараты

Я извлек все .c & .h файлы из LZMA SDK и добавил их в мой проект.

Затем я сверился с этим постом, LZMA SDK — Как использовать
, и реализовать 2 служебные функции:

bool DecompressLZMA(_In_ const ByteVector& vecIn, _Out_ ByteVector& vecOut)
bool CompressLZMA(_In_ const ByteVector& vecIn, _Out_ ByteVector& vecOut)

Я проверил код, позвонив CompressLZMA а потом DecompressLZMA проверить полный цикл.

проблема

CompressLZMA звонок прошел успешно, однако DecompressLZMA вызов сгенерированный результат SZ_ERROR_INPUT_EOF

Вопрос

Что я делаю неправильно?

Код

#include "stdafx.h"#include "LZMA/LzmaLib.h"
using ByteVector = vector < byte >;

bool Cast(const ByteVector& vecByte, string& res)
{
string strTmp(&vecByte[0], &vecByte[0] + vecByte.size());
res = strTmp;
return true;
}

bool Cast(const string& strVal, ByteVector& vecByte)
{
vecByte = vector<BYTE>(&strVal[0], &strVal[0] + strVal.length());
return true;
}

bool DecompressLZMA(_In_ const ByteVector& vecIn, _Out_ ByteVector& vecOut)
{
try
{
int iLZMA_PROPS_SIZE = LZMA_PROPS_SIZE;
vecOut.resize(vecIn.size() * 10);
unsigned dstLen = vecOut.size();
unsigned srcLen = vecIn.size() - iLZMA_PROPS_SIZE;
SRes res = LzmaUncompress(
&vecOut[0], &dstLen,
&vecIn[iLZMA_PROPS_SIZE], &srcLen,
&vecIn[0], iLZMA_PROPS_SIZE);
assert(res == SZ_OK);
if (res == SZ_OK) {
vecOut.resize(dstLen);
return true;
}

}

// nothing to do. just return false
catch (...)
{
}

return false;
}

bool CompressLZMA(_In_ const ByteVector& vecIn, _Out_ ByteVector& vecOut)
{
try
{
unsigned propsSize = LZMA_PROPS_SIZE;
unsigned destLen = vecIn.size() + vecIn.size() / 3 + 128;
vecOut.resize(propsSize + destLen);

int res = LzmaCompress(
&vecOut[LZMA_PROPS_SIZE], &destLen,
&vecIn[0], vecIn.size(),
&vecOut[0], &propsSize,
-1, 0, -1, -1, -1, -1, -1);

assert(propsSize == LZMA_PROPS_SIZE);
assert(res == SZ_OK);

vecOut.resize(propsSize + destLen);
return true;
}

// nothing to do. just return false
catch (...)
{
}

return false;
}

int main()
{
string strTest = "a test string";
ByteVector vec1, vec2, vec3;
Cast(strTest, vec1);

CompressLZMA(vec1, vec2);
DecompressLZMA(vec2, vec3);

string strTestCycle;
Cast(vec3, strTestCycle);

return 0;
}

2

Решение

Задача ещё не решена.

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

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

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