shasoft
@shasoft

Как распаковать поток LZMA2 с помощью Lzma2Dec_DecodeToDic (LZMA SDK)?

Запаковал поток данных с помощью метода LZMA2
bool res = false;
			// Создать упаковщик
			CLzma2EncHandle enc;
			enc = Lzma2Enc_Create(&g_AlignedAlloc, &g_BigAlloc);
			if (enc) {
				// Создать параметры
				CLzma2EncProps props;
				Lzma2EncProps_Init(&props);
				lzma2::initProps(&props.lzmaProps,level);
				Lzma2EncProps_Normalize(&props);
				if (Lzma2Enc_SetProps(enc, &props) == SZ_OK) {
					// Тип упаковки
					WORD wType = ARC_LZMA2;
					pOut->write(&wType,sizeof(wType));
					// Параметр упаковщика (требуется для распаковки)
					Byte prop = Lzma2Enc_WriteProperties(enc);
					pOut->write(&prop, 1);
					// Упаковать
					res = (Lzma2Enc_Encode2(
						enc,
						pOut, NULL, 0,
						pIn, NULL, 0,
						NULL) == SZ_OK);
				}
				// Уничтожить упаковщик
				Lzma2Enc_Destroy(enc);
			}
			return res;

Но никак не пойму как его можно распаковать с помощью функции Lzma2Dec_DecodeToDic или Lzma2Dec_DecodeToBuf.

Может кто-то подскажет как это сделать?

Пытаюсь распаковать так (код отсюда )
#define IN_BUF_SIZE (1<<16)
#define OUT_BUF_SIZE (1<<16)
		// Распаковать
		bool lzma2::unpack(stream_in *pIn,stream_out *pOut)
		{
			bool ret = false;
			// Тип упаковки
			WORD wType;
			if (pIn->read(&wType, sizeof(wType)) && wType==ARC_LZMA2) {
				Byte prop;
				if (pIn->read(&prop, sizeof(prop))) {
					UInt64 unpackSize;
					int i;
					SRes res = 0;
					CLzma2Dec state;
					Lzma2Dec_Construct(&state);
					RINOK(Lzma2Dec_AllocateProbs(&state, prop, &g_Alloc));
					unpackSize = 512000;
					//m_lUncompressedSize = unpackSize;
					int thereIsSize = (unpackSize != (UInt64)(Int64)-1);
					Byte inBuf[IN_BUF_SIZE];
					Byte outBuf[OUT_BUF_SIZE];
					state.decoder.dic = outBuf;
					state.decoder.dicBufSize = OUT_BUF_SIZE;
					size_t inPos = 0, inSize = 0, outPos = 0;
					Lzma2Dec_Init(&state);
					for (;;)
					{
						if (inPos == inSize)
						{
							inSize = IN_BUF_SIZE;
							pIn->read(inBuf, inSize ,&inSize);
							inPos = 0;
						}
						{
							SRes res;
							SizeT inProcessed = inSize - inPos;
							SizeT outProcessed = OUT_BUF_SIZE - outPos;
							ELzmaFinishMode finishMode = LZMA_FINISH_ANY;
							ELzmaStatus status;
							if (thereIsSize && outProcessed > unpackSize)
							{
								outProcessed = (SizeT)unpackSize;
								finishMode = LZMA_FINISH_END;
							}
							//* Вот этот кусок на втором вызове возвращает ошибку SZ_ERROR_DATA
							res = Lzma2Dec_DecodeToDic(&state
								, OUT_BUF_SIZE
								, inBuf + inPos
								, &inProcessed
								, finishMode
								, &status);
							state.decoder.dicPos = 0;
							//*/
							/*
							res = Lzma2Dec_DecodeToBuf(&state
								, outBuf + outPos
								, &outProcessed
								, inBuf + inPos
								, &inProcessed
								, finishMode, &status);
							//*/

							inPos += inProcessed;
							outPos += outProcessed;
							unpackSize -= outProcessed;
							if ((pOut) && (res == SZ_OK))
								if (pOut->write(outBuf, outPos) != outPos)
									return false;
							outPos = 0;
							if (res != SZ_OK || thereIsSize && unpackSize == 0)
								return res;
							/*
							if (pfnExtractCallback)
							{
								if (!pfnExtractCallback((m_lUncompressedSize - unpackSize)
									, m_lUncompressedSize
									, 0
									, 0
									, m_dwExtraData))
								{
									return SZ_ERROR_PROGRESS;
								}
							}
							//*/
							if (inProcessed == 0 && outProcessed == 0)
							{
								if (thereIsSize || status != LZMA_STATUS_FINISHED_WITH_MARK)
									return SZ_ERROR_DATA;
								return res;
							}
						}
					}
				}
				int g = 0;
			}
			return ret;
		}
  • Вопрос задан
  • 32 просмотра
Пригласить эксперта
Ответы на вопрос 1
2ord
@2ord
продвинутый чайник
https://cpp.hotexamples.com/examples/-/-/Lzma2Dec_...
4-я ссылка в Гугле по Lzma2Dec_DecodeToDic.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы