Программно LZMA распаковывает статический LZMA-сжатый файл - PullRequest
0 голосов
/ 10 февраля 2012

Я распаковываю файл ресурсов LZMA, который я ранее сжал с помощью lzma e <infile> <outfile> -lc0 -lp2 из терминала и импортировал в мой проект. Однако при применении к этому файлу LzmaDec_DecodeToBuf возвращает 1 в первой итерации, т.е. ошибка данных LZMA. (Также к этому времени inLen всегда равно 5, outLen равно 0.)

Почему это?

Мой код гласит:

SRes static decompress(FILE *inFile, FILE *outFile)
{
  // Position the inFile pointer at the start.
  fseek(inFile, 0, SEEK_SET);

  // Read in LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header.
  char unsigned header[LZMA_PROPS_SIZE+8];
  fgets(header, sizeof(header), inFile);
  CLzmaDec state;
  LzmaDec_Construct(&state);
  SRes res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &SzAllocForLzma);

  if (res != SZ_OK) {
    // Free all allocated structures.
    LzmaDec_Free(&state, &SzAllocForLzma);
    return res;
  }

  char unsigned inBuf[IN_BUF_SIZE];
  char unsigned outBuf[OUT_BUF_SIZE];
  LzmaDec_Init(&state);

  ELzmaStatus status;
  long unsigned outLen = sizeof(outBuf);
  long unsigned inLen = sizeof(inBuf);
  long unsigned inPos = ftell(inFile);

  while (fgets(inBuf, sizeof(inBuf), inFile) != NULL) {
    inLen = MIN(sizeof(inBuf), MAX(ftell(inFile)-inPos, 0));
    outLen = sizeof(outBuf);

    SRes res = LzmaDec_DecodeToBuf(&state,
                                   outBuf,
                                   &outLen,
                                   inBuf,
                                   &inLen,
                                   LZMA_FINISH_ANY,
                                   &status);
// continues...

Ответы [ 2 ]

1 голос
/ 23 февраля 2013

Это довольно старый пост, на который нужно отвечать, однако я столкнулся с этой же проблемой.

Проблема в том, что заголовок НЕ должен быть частью данных, которые вы распаковываете. Решение заключается в том, чтобы при чтении данных начать с sizeof (заголовок) вместо 0 , и не забудьте также настроить его общую длину на sizeof (заголовок) также.

0 голосов
/ 28 января 2013

Вы уверены, что ввод не 7zArchive?Для этого потребуются вызовы SzArEx_Open и SzArEx_Extract.

...