请问那位朋友对 flash 的 swf 文件比较熟悉的?我在写一段读取 swf 文件的宽高时,当碰到被压缩后的 swf 老是出错,在网上看了些资料,说是得用 zlib 对第 8 位字节后的数据进行解压,可我从网上下的 zlib 算法模块总是无法解出第 8 位字节后的数据!请那位高手指点一下!

解决方案 »

  1.   

    修改一下,是 swf 文件的影片宽高 ,不是 swf 文件的宽高!
      

  2.   

    BOOL GetRect(CString path,CRect &rt)
    {
    //打开 flash 文件
    CFile file;
    if(!file.Open(path,CFile::modeRead | CFile::typeBinary))
    return FALSE; //读取头 3 个字节,判断 flash 数据是否被压缩,或是否是有效的 flash 文件
    BYTE bFlag[ 3 ] = {0};
    file.SeekToBegin();
    if(!file.Read(bFlag,3))
    {
    file.Close();
    return FALSE;
    } BOOL bZlib = FALSE;
    if( ( bFlag[0] == 'F' ) &&
    ( bFlag[1] == 'W' ) &&
    ( bFlag[2] == 'S' ) )
    {
    bZlib = FALSE;
    }
    else
    if( ( bFlag[0] == 'C' ) &&
    ( bFlag[1] == 'W' ) &&
    ( bFlag[2] == 'S' ) )
    {
    bZlib = TRUE;
    }
    else
    {
    file.Close();
    return FALSE;
    } //分配内存,用以读取 flash 文件和解压 flash 文件
    long nFileLen = file.GetLength();
    Byte *pBytes     = (Byte*)calloc((uInt)nFileLen, 1);
    Byte *pDestBytes = (Byte*)calloc((uInt)nFileLen * 2, 1); //分配足够大的空间,用以解压 memset(pBytes,'\0',nFileLen);
    memset(pDestBytes,'\0',2 * nFileLen); unsigned long nDestLen = 0;
    if(bZlib)
    {//数据被压缩过,需要解压
    //从第 8 个字节读取,读取影片宽高字节信息
    file.Seek(8,CFile::begin);
    file.Read(pBytes,nFileLen - 8); int nReturn = uncompress(pDestBytes,&nDestLen,pBytes,nFileLen - 8);
    } //计算 flash 影片宽高
    BOOL bGet = GetRect(pBytes,rt);
    free(pBytes);
    free(pDestBytes);
    file.Close(); return TRUE;
    }这是我写解压并读取影片宽高的函数
      

  3.   

    其中的
    int nReturn = uncompress(pDestBytes,&nDestLen,pBytes,nFileLen - 8);
    返回的总是 Z_BUF_ERROR 
    请高手指教一下!
    zlib 算法源代码可在 www.zlib.net 网面上直接下载到
      

  4.   

    Byte *pDestBytes = (Byte*)calloc((uInt)nFileLen * 2, 1); //分配足够大的空间,用以解压
    =================
    长度错了.
    呵呵,,长度应该拿文件头的那个长度.
    file.seek(4);
    int nDestLen;
    file.read(&nDestLen , 4);
      

  5.   

    已经改过,但仍然出错!改过后
    file.Seek(4,CFile::begin);
    int nSwfLen = 0;
    file.Read(&nSwfLen , 4);
    Byte *pDestBytes = (Byte*)calloc((uInt)nSwfLen, 1); //分配足够大的空间,用以解压 memset(pBytes,'\0',nFileLen);
    memset(pDestBytes,'\0',nSwfLen);
      

  6.   

    谢谢,我已经找到原因了,unsigned long nDestLen = 0;
     
    是这一句出错,我忘了给它赋值了!
    应该改成 unsigned long nDestLen = nSwfLen;