请问那位朋友对 flash 的 swf 文件比较熟悉的?我在写一段读取 swf 文件的宽高时,当碰到被压缩后的 swf 老是出错,在网上看了些资料,说是得用 zlib 对第 8 位字节后的数据进行解压,可我从网上下的 zlib 算法模块总是无法解出第 8 位字节后的数据!请那位高手指点一下!
解决方案 »
- WaitForSingleObject会得不到SetEvent事件吗?
- 非界面的对象该放在哪儿?
- combobox下拉事件
- 热键大小写判断问题 ~~~
- 请问用VC该怎么编VXD,高手请近
- 如何取得IIS的IScriptingContext接口以调用ASP内置的Server对象呢?
- C++编程,文件路径保存在txt文件里,如果删除实现按路径删除
- LoadLibrary的问题
- 我把一个复选框按钮声明成:BOOL m_Check1;为什么无论我是否选 中该按钮,它的值一直为“假”。谢谢。
- 送分的我又来啦!高手过来拿分吧
- 子窗口全屏后,怎样也无法退出,设断点发现鼠标双击和按键都无法正常传入,请高手赐教
- 32位程序在64位系统上为何不能正常运行
{
//打开 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;
}这是我写解压并读取影片宽高的函数
int nReturn = uncompress(pDestBytes,&nDestLen,pBytes,nFileLen - 8);
返回的总是 Z_BUF_ERROR
请高手指教一下!
zlib 算法源代码可在 www.zlib.net 网面上直接下载到
=================
长度错了.
呵呵,,长度应该拿文件头的那个长度.
file.seek(4);
int nDestLen;
file.read(&nDestLen , 4);
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);
是这一句出错,我忘了给它赋值了!
应该改成 unsigned long nDestLen = nSwfLen;