у меня есть 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;
}
Задача ещё не решена.
Других решений пока нет …