解析swf文件头,获取flash的原始尺寸
要想解析swf文件头,首先要弄清楚的当然是swf文件格式规范。规范中对swf文件格式作了详细的说明。关于swf文件头,它是由以下几个部分组成:
+-------+---+--------+--------+---+----+
|文件标识|版本|文件大小|RECT字段|帧频|帧数|
+-------+---+--------+--------+---+----+
其中“文件标识”为3个字节,包括文件压缩标志。这3个字节的内容为“FWS”或“CWS”,以‘C’开头的表示swf文件是采用的压缩输出(从RECT字段开始至文件结尾,采用Zlib标准进行文件压缩)。
“版本”为一个字节,存储8位字长的无符号整数,将swf文件的导出版本以16进制方式存储在该字节,如导出版本为7,则该字节存储值为0x07,而不是‘7’对应的ASCII值(0x37)。
“文件大小”存储占用4个字节,为32位无符号整数,将未压缩的swf文件大小以16进制形式存入该4个字段,值得注意的是,swf文件存储是按照 little-endian,即低字节在前的“小尾”方式存储的,解析时,需要注意字节序。如一个swf文件大小为471字节,则该4个字节,由低位到高 位,存储的内容将是0xd7,0x01,0x00,0x00。
“帧频”占用两个字节,表示每秒播放的帧数,存储方式是8.8共16位的定点数,整数部分在高位(即第二个字节),小数部分在低位(第一个字节),并按字 节对齐。如小数7.5表示为16进制是0x07.80,按照低位在前,高位在后表示,这16位将存储为如下的2进制代码10000000 00000111。
“帧数”占用两个字节,为16位无符号整数,表示swf文件的总帧数。存储方式类似于“文件大小”存储方式。
难理解的是RECT字段,该字段采用swf文件格式规范中定义的“位值”(bit_value)进行存储的,这种存储特征是可以节约字节数,但数值是跨字 节的。该段存储内容是用‘twip’(翻译为‘缇’,1pixel = 20twips)单位表示的播放窗口的尺寸。分为Nbits,表示后面字段的bit_value位长;Xmin,Xmax,Ymin,Ymax分别表示 X,Y轴方向上的最小和最大值。
先说一下bit_value,其特点是不管字节区分,按照最小位数(bits)将值连续存储,在末字节中空位补0,比如两个9位表示的无符号值7,8将占用3个字节,表示为2进制就是:
00000011 10000010 00000000
将3个字节按位连在一起,前9位值为7,再9位值为8,在第3个字节的其他空位全部补0。简单了解了bit_value表示方式,再说RECT结构,该字 段前5位(bit)为Nbits字段,表示后面字段的bit_value位长,是一个无符号数,也就是说最大值为为31,如此一来,整个RECT字段的最 大长度为17个字节,也就是说swf文件头最大不超过29个字节。通过Nbits字段得到后面字段的bit_value位长后,就可以确定RECT的具体 长度,继而得知“帧频”和“帧数”的存储位置。在RECT字段中,从第6位开始,存储的是播放窗口的尺寸数据,根据Nbits值,将后面的部分按位分开计 算,即可得到相应值。但对文件标识为“CWS”的swf文件,从“文件大小”字段后面开始(即从第8个字节后面开始),是按照Zlib标准压缩存储的,所 以,在解析swf文件头时,首先需判断swf文件是否按照压缩格式导出的。如果是以压缩格式导出的,则需先对头8个字节后面的内容进行解压缩处理了,再来 处理RECT字段和“帧频”和“帧数”字段。
解析swf文件头,获取flash的原始尺寸的更多相关文章
- JavaScript获取图片的原始尺寸
页面里的img元素,想要获取它的原始尺寸,以宽度为例可能首先想到的就是width,如下 <img src="http://img11.360buyimg.com/da/g14/M07/ ...
- js获取图片信息(一)-----获取图片的原始尺寸
如何获取图片的原始尺寸大小? 如下,当给 img 设置一个固定的大小时,要怎样获取图片的原始尺寸呢? #oImg{ width: 100px; height: 100px; } <img src ...
- 如何用JavaScript在浏览器端获取图片的原始尺寸大小?
var img = $("#img_id"); // Get my img elem var pic_real_width, pic_real_height; $("&l ...
- js获取图片的原始尺寸
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...
- jq获取图片的原始尺寸,自适应布局
原理: each()遍历,width().height()获取宽高, load() 注意: 由于页面加载完了,但图片不一定加载完了,所以直接通过 $("img").width(), ...
- DEX文件解析---1、dex文件头解析
DEX文件解析---1.dex文件头解析 一.dex文件 dex文件是Android平台上可执行文件的一种文件类型.它的文件格式可以下面这张图概括: dex文件头一般固定为0x70个字 ...
- PE文件头格式解析
前言: 昨天写了一题de1ctf的题,发现要脱壳,手脱之后发现要iat修复,我就发现自己在这块知识缺失了,win逆向,好像一直都是打ctf,然后用逆向方法论去肝的 其他方面倒是没有很深入学习,但实际上 ...
- python实现解析markdown文档中的图片,并且保存到本地~
背景 前阵子简书好像说是凉了,搞得我有点小慌,毕竟我的大部分博客都是放在简书上面的,虽然简书提供了打包导出功能,但是只能导出文字,图片的话还是存在简书服务器上面,再加上我一直想要重新做一个个人博客,于 ...
- 【记录】JS 获取图片原始尺寸-防止图片溢出
示例代码: <div id="div_content"> <img src="http://static.cnblogs.com/images/logo ...
随机推荐
- [UE4]运行时脱离视角,进入自由视角
按 Shift + F1让鼠标脱离游戏窗口,然后点击右上角的按钮,然后鼠标在游戏窗口点击一下,就只有自由漫游了. 还可以点击选中Word Outliner窗口的物体.
- Elasticsearch简介与安装
搜索 就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索的关键字,然后就期望找到这个关键字相关的有些信息 垂直搜索 站内搜索 互联网搜索 电商网站,招聘网站,新闻网站,各种app IT系 ...
- Windows NAT端口映射
由于有需求进行端口映射,又不想装乱七八糟的软件,Windows本身自带的路由远程访问配置太麻烦,还要两块网卡,坑爹啊. 其实Windows本身命令行支持配置端口映射,条件是已经安装了IPV6,启不启用 ...
- SQL server约束
约束的概念:确保在列中输入有效的值并维护表之间的关系. Primary key约束 功能:primary key(主键约束),一个表中只能有一个,不能有空值,不能有重复值. 创建表时定义约束:字段名 ...
- tornado 和 djanjo 转义处理对比
tornado tornado默认是转义所有字符,比较安全,但有时候我们的确需要把字符当做html来解析处理,因此我们需要做些处理. 所有的模板输出都已经通过 tornado.escape.xhtml ...
- 转:Java对象序列化
Java对象序列化 当两个进程在进行远程通信时,彼此可以发送各种类型的数据.无论是何种类型的数据,都会以二进制序列的形式在网络上传送.发送方需要把这个Java对象转换为字节序列,才能在网络上传送:接收 ...
- (转)centos6.5 bind-DNS服务器bind的搭建详解
centos6.5环境DNS-本地DNS服务器bind的搭建 域名系统(英文:Domain Name System,缩写:DNS)是因特网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库, ...
- ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - ROSMapModify - ROS地图修改
ROS进阶学习笔记(11)- Turtlebot Navigation and SLAM - 2 - MapModify地图修改 We can use gmapping model to genera ...
- faceted project validation builder
Should I keep Eclipse Java facet? Facets automate some parts of project configuration and deployment ...
- 序列化 (实现RPC的基础)
public interface ISerializer { <T> byte[] serializer(T obj); <T> T deSerializer(byte[] d ...