解析swf的RECT结构

来源:互联网 发布:阿里数据分析 编辑:程序博客网 时间:2024/05/01 08:34

解析SWF文件头中的Rect结构

转自:http://www.wwswf.com/?p=897

 

swf头中的Rect结构是按照位进行存储的,而不是字节,因为存储的值是跨字节的,而且存储的单位是twip,相当于二十分之一像素。

Rect结构中包含四个信息,按照顺序依次为:Xmin、Xmax、Ymin、Ymax,分别表示 X,Y轴方向上的最小和最大值。

Rect中前五位表示一个长度信息n,就是其中要存储的四个值所占用的长度,即从第六位开始,第一个n位表示Xmin,第二个n位表示Xmax,依次类推,直到取到存储的4个值,字节未用完的部分补0。

举个例子:
swf的头如下所示:

PLAIN TEXT
JAVA:
  1. 4657 53 0A 4C15 00 00 78 0005 5F 00 00 0F A0 
  2. 0000 12 01 00 4411 18 00 00 00 7F13 04 05 00

开始3个字节为FWS,0A为10,表示版本号,“4C 15 00 00 ”为文件大小,从"78"开始即可读Rect结构。
“78”的二进制代码为:01111000,前5位就是01111,十进制值为15,就是说从第六位开始,每隔15位表示一个swf尺寸值。

“78 00 05 5F 00 00 0F A0”用二进制表示为:

PLAIN TEXT
JAVA:
  1. 01111000000000000000 010101011111000000000000000000 00111110100000

那么000000000000000 十进制为0,表示Xmin,010101011111000十进制值为11000,换算成像素为550,表示Xmax,最后面的00111110100000只有14位,比15位少了一位,所以需要从后面一个字节拿一位过来,后面的字节16进制值为00,二进制值为00000000,被借了一位,那么剩余的7位都废了,即属于补0部分,至此Rect结构就结束了。

之后的00 12表示帧率,由于swf是反序存入的,所以应该按照12 00转换为十进制,即为4608,4608/256=18(因为低8位是小数,所以需要除以2的8次方),swf的帧率即为18.

再之后两位是01 00,反序之后十进制即为1,swf总帧数为1.


本文转自: http://www.cnblogs.com/sevenyuan/archive/2010/04/28/1723189.html

0 0
原创粉丝点击