+ -
当前位置:首页 → 问答吧 → LSZZ解压不成功,是什么原因?

LSZZ解压不成功,是什么原因?

时间:2011-09-22

来源:互联网

C/C++ code

//---------------------------------------------------------------------------

bool unpack_data(const byte *CompressedBuffer, int PackedSize, byte *DeCompressedBuffer,
                         int DecompressedBufferSize)
{
    const byte *CompressedPtr;
    byte *DecompressedPtr;
    size_t offset;
    int tmp, count;
    unsigned ReadChecksum, CalculatedChecksum;
    int rpos, rlen;
    int chunk, size;
    unsigned char FlagByte;
    byte b1, b2;

    if ( (PackedSize-=4)<=0) return false; // no room for checksum
    size = 0;
    DecompressedPtr =DeCompressedBuffer;

    /* Each data block is preceded by a byte telling us what to do with
    * the next 8 bytes.
    */

    for (offset=0;offset < PackedSize; )
    {
     FlagByte = CompressedBuffer[offset++];// grab the encoding byte
     for (count = tmp=1;tmp < 256 && offset < PackedSize ; tmp*=2, count++)
     {
       CompressedPtr = &CompressedBuffer[offset];
       size = DecompressedPtr - DeCompressedBuffer;
       if (FlagByte & tmp) /* Append the byte to output */
       {
        *DecompressedPtr++ = *CompressedPtr;
         offset++;
       }
       else
       {
         /* Read a pointer */
        b1 = *CompressedPtr;
        b2 = *(CompressedPtr + 1);
        offset += 2;
        rpos = size - b1 - 256 * ( b2/16 );
        rlen = b2 - 16 * (b2 / 16) + 3;
        if ((rpos + rlen) < 0)
        {
         size+=rlen;
         while (rlen--) *DecompressedPtr++ = ' ';
        }
        else
        if ((DeCompressedBuffer + rpos) > DecompressedPtr)    return false;//PBO_STS_OUT_OF_BOUNDS;
        /* PAD the file with a block from another place in the file */
        else
        if ((rpos + rlen) <= size)
        {
         while (rpos < 0)
         {
          *DecompressedPtr++ = ' ';
          rlen--;
          rpos++;
         }
         memcpy(DecompressedPtr, &DeCompressedBuffer[rpos], rlen);
         DecompressedPtr += rlen;
         size += rlen;
        }
      /* PAD the file with the block until size is rpos + rlen */
        else
        if ((rpos + rlen) > size)
        {
         chunk = size - rpos;
         while (rlen > 0)
         {
          if (chunk > rlen) chunk = rlen;
          if (!chunk) return false;//PBO_STS_CHUNK_ZERO;  就是这里不成功了,这是什么?
          memcpy(DecompressedPtr, &DeCompressedBuffer[rpos], chunk);
          DecompressedPtr += chunk;
          size += chunk;
          rlen -= chunk;
         }
        }
       }
      }//while temp
     }//while offset

     /* Last 4 bytes of the packed data is the checksum, unsigned int */
     memcpy(&ReadChecksum, &CompressedBuffer[PackedSize], sizeof(ReadChecksum));

     for (CalculatedChecksum = 0,DecompressedPtr = DeCompressedBuffer ;
          DecompressedPtr < &DeCompressedBuffer[DecompressedBufferSize] ; )
          CalculatedChecksum += *DecompressedPtr++;
     if (ReadChecksum != CalculatedChecksum)
        return false;//PBO_STS_CHECKSUM;
     return true; //PBO_STS_NO_ERROR;
}
//---------------------------------------------------------------------------

作者: cankoo   发布时间: 2011-09-22

C/C++ code

        if ((rpos + rlen) > size)
        {
         chunk = size - rpos;
         while (rlen > 0)
         {
          if (chunk > rlen) chunk = rlen;
          if (!chunk) return false;//PBO_STS_CHUNK_ZERO;  就是这里不成功了,这是什么?
          memcpy(DecompressedPtr, &DeCompressedBuffer[rpos], chunk);
          DecompressedPtr += chunk;
          size += chunk;
          rlen -= chunk;
         }



谁回一下,把分给谁

作者: cankoo   发布时间: 2011-09-24

PBO_STS_CHUNK_ZERO应该是lz在前面定义的一个宏

作者: Jake443403168   发布时间: 2011-09-24